Newer Version Available
DML 操作と擬似コールアウトの実行
デフォルトでは、必ず同じトランザクション内で DML 操作の後にコールアウトを実行することは許可されません。これは DML 操作によって、コミットされていない待機中の作業が発生してコールアウトの実行が妨げられるためです。場合によっては、コールアウトを行う前に、DML を使用してテストメソッドにテストデータを挿入する必要が生じることがあります。これを行うには、コールアウトを実行するコード部分を Test.startTest と Test.stopTest ステートメントの間に配置します。Test.startTest ステートメントは、Test.setMock ステートメントの前に配置する必要があります。また、DML 操作のコールは、Test.startTest/Test.stopTest ブロックの一部にすることはできません。
擬似コールアウト後の DML 操作は許可されており、テストメソッドでの変更は必要ありません。
擬似コールアウト前の DML の実行
この例は、前の例に基づいています。この例では、Test.startTest および Test.stopTest ステートメントを使用して、テストメソッドで疑似コールアウトの前に DML 操作を実行できるようにします。テストメソッド (testEchoString) は最初にテスト取引先を挿入し、Test.startTest をコールします。次に、Test.setMock を使用して疑似コールアウトモードを設定して、コールアウトを実行するメソッドをコールし、疑似応答値を確認します。最後に、Test.stopTest をコールします。
1@isTest
2private class WebSvcCalloutTest {
3 @isTest static void testEchoString() {
4 // Perform some DML to insert test data
5 Account testAcct = new Account('Test Account');
6 insert testAcct;
7
8 // Call Test.startTest before performing callout
9 // but after setting test data.
10 Test.startTest();
11
12 // Set mock callout class
13 Test.setMock(WebServiceMock.class, new WebServiceMockImpl());
14
15 // Call the method that invokes a callout
16 String output = WebSvcCallout.callEchoString('Hello World!');
17
18 // Verify that a fake result is returned
19 System.assertEquals('Mock response', output);
20
21 Test.stopTest();
22 }
23}非同期 Apex と擬似コールアウト
DML と同様に、非同期 Apex 操作では、コミットされていない待機中の作業によって、同じトランザクションの後の方でコールアウトの実行が妨げられる結果に��ります。非同期 Apex 操作の例としては、future メソッド、Apex 一括処理、スケジュール済み Apex のコールがあります。通常、これらの非同期コールは、Test.stopTest の後で実行されるようにするため、テストメソッドで Test.startTest と Test.stopTest ステートメント間に配置します。この場合、擬似コールアウトは非同期コールの後で実行できるため、変更は不要です。ただし、非同期コールが Test.startTest と Test.stopTest ステートメント間に配置されていない場合は、コミットされていない待機中の作業のため例外が発生します。この例外を回避するには、次のいずれかを行います。
- 非同期コールを Test.startTest と Test.stopTest ステートメント間に配置する。
1Test.startTest(); 2MyClass.asyncCall(); 3Test.stopTest(); 4 5Test.setMock(..); // Takes two arguments 6MyClass.mockCallout(); - DML コールと同じルールに従う。つまり、コールアウトを実行するコード部分を Test.startTest と Test.stopTest ステートメント間に配置します。Test.startTest ステートメントは、Test.setMock ステートメントの前に配置する必要があります。また、非同期コールは、Test.startTest/Test.stopTest ブロックの一部にすることはできません。
1MyClass.asyncCall(); 2 3Test.startTest(); 4Test.setMock(..); // Takes two arguments 5MyClass.mockCallout(); 6Test.stopTest();
擬似コールアウト後の非同期コールは許可されており、テストメソッドでの変更は必要ありません。