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