DML 操作と擬似コールアウトの実行
デフォルトでは、必ず同じトランザクション内で DML 操作の後にコールアウトを実行することは許可されません。これは DML 操作によって、コミットされていない待機中の作業が発生してコールアウトの実行が妨げられるためです。場合によっては、コールアウトを行う前に、DML を使用してテストメソッドにテストデータを挿入する必要が生じることがあります。これを行うには、コールアウトを実行するコード部分を Test.startTest と Test.stopTest ステートメントの間に配置します。Test.startTest ステートメントは、Test.setMock ステートメントの前に配置する必要があります。また、DML 操作のコールは、Test.startTest/Test.stopTest ブロックの一部にすることはできません。
擬似コールアウト後の DML 操作は許可されており、テストメソッドでの変更は必要ありません。
DML 操作のサポートは、HttpCalloutMock インターフェースおよび静的リソース (StaticResourceCalloutMock または MultiStaticResourceCalloutMock) を使用することで、疑似コールアウトのすべての実装で動作します。次の例では、実装された HttpCalloutMock インターフェースを使用しますが、同じ方法を静的リソースを使用するときにも適用できます。
擬似コールアウト前の DML の実行
この例は、前の HttpCalloutMock の例に基づいています。この例では、Test.startTest および Test.stopTest ステートメントを使用して、テストメソッドで疑似コールアウトの前に DML 操作を実行できるようにします。テストメソッド (testCallout) は最初にテスト取引先を挿入し、Test.startTest をコールします。次に、Test.setMock を使用して疑似コールアウトモードを設定して、コールアウトを実行するメソッドをコールし、疑似応答値を確認します。最後に、Test.stopTest をコールします。
1swfobject.registerObject("clippy.codeblock-0", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17@isTest
18private class CalloutClassTest {
19 @isTest static void testCallout() {
20 // Perform some DML to insert test data
21 Account testAcct = new Account('Test Account');
22 insert testAcct;
23
24 // Call Test.startTest before performing callout
25 // but after setting test data.
26 Test.startTest();
27
28 // Set mock callout class
29 Test.setMock(HttpCalloutMock.class, new MockHttpResponseGenerator());
30
31 // Call method to test.
32 // This causes a fake response to be sent
33 // from the class that implements HttpCalloutMock.
34 HttpResponse res = CalloutClass.getInfoFromExternalService();
35
36 // Verify response received contains fake values
37 String contentType = res.getHeader('Content-Type');
38 System.assert(contentType == 'application/json');
39 String actualValue = res.getBody();
40 String expectedValue = '{"foo":"bar"}';
41 System.assertEquals(actualValue, expectedValue);
42 System.assertEquals(200, res.getStatusCode());
43
44 Test.stopTest();
45 }
46}非同期 Apex と擬似コールアウト
- 非同期コールを 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();
擬似コールアウト後の非同期コールは許可されており、テストメソッドでの変更は必要ありません。