Newer Version Available
HttpCalloutMock インターフェースの実装による HTTP コールアウトのテスト
HttpCalloutMock インターフェースを実装して respond メソッドで送信される応答を指定できるようにします。Apex ランタイムでこのメソッドをコールしてコールアウトへの応答を送信します。
1swfobject.registerObject("clippy.codeblock-0", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17global class YourHttpCalloutMockImpl implements HttpCalloutMock {
18 global HTTPResponse respond(HTTPRequest req) {
19 // Create a fake response.
20 // Set response values, and
21 // return response.
22 }
23}擬似応答の値を指定したら、テストメソッドで Test.setMock をコールし、この擬似応答を送信するように Apex ランタイムに指示できます。次のように、第 1 引数では HttpCalloutMock.class を渡し、第 2 引数では HttpCalloutMock のインターフェース実装の新しいインスタンスを渡します。
1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Test.setMock(HttpCalloutMock.class, new YourHttpCalloutMockImpl());これ以降で HTTP コールアウトがテストコンテキストで呼び出された場合、コールアウトは実行されず、respond メソッド実装で指定した擬似応答が受信されます。
次の詳細な例は、HTTP コールアウトのテスト方法を示しています。インターフェースの実装 (MockHttpResponseGenerator) が最初に記述されています。その後に、テストメソッドを含むクラスと、テストでコールするメソッドを含む別のクラスが続きます。testCallout テストメソッドは、getInfoFromExternalService をコールする前に Test.setMock をコールすることで擬似コールアウトモードを設定します。次に、返された応答が、実装された respond メソッドで送信した内容と同じであることを確認します。各クラスを個別に保存して、CalloutClassTest でテストを実行します。
1swfobject.registerObject("clippy.codeblock-2", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17@isTest
18global class MockHttpResponseGenerator implements HttpCalloutMock {
19 // Implement this interface method
20 global HTTPResponse respond(HTTPRequest req) {
21 // Optionally, only send a mock response for a specific endpoint
22 // and method.
23 System.assertEquals('http://api.salesforce.com/foo/bar', req.getEndpoint());
24 System.assertEquals('GET', req.getMethod());
25
26 // Create a fake response
27 HttpResponse res = new HttpResponse();
28 res.setHeader('Content-Type', 'application/json');
29 res.setBody('{"foo":"bar"}');
30 res.setStatusCode(200);
31 return res;
32 }
33}1swfobject.registerObject("clippy.codeblock-3", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class CalloutClass {
18 public static HttpResponse getInfoFromExternalService() {
19 HttpRequest req = new HttpRequest();
20 req.setEndpoint('http://api.salesforce.com/foo/bar');
21 req.setMethod('GET');
22 Http h = new Http();
23 HttpResponse res = h.send(req);
24 return res;
25 }
26}1swfobject.registerObject("clippy.codeblock-4", "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 // Set mock callout class
21 Test.setMock(HttpCalloutMock.class, new MockHttpResponseGenerator());
22
23 // Call method to test.
24 // This causes a fake response to be sent
25 // from the class that implements HttpCalloutMock.
26 HttpResponse res = CalloutClass.getInfoFromExternalService();
27
28 // Verify response received contains fake values
29 String contentType = res.getHeader('Content-Type');
30 System.assert(contentType == 'application/json');
31 String actualValue = res.getBody();
32 String expectedValue = '{"foo":"bar"}';
33 System.assertEquals(actualValue, expectedValue);
34 System.assertEquals(200, res.getStatusCode());
35 }
36}