Apexコールアウトのテストクラスの書き方

By | July 2, 2021

概要

実際のApexCalloutが外部のエンドポイントに対してHTTP Requestを送信するのに対して、ApexCalloutのTestでは疑似的なエンドポイントをMock Classのインスタンス化によって作成し、そこに対してHTTP Requestを送信するというかたちを取ります。

以下、コードサンプルです。

コードサンプル

Calloutクラス

public calss TestCallout{
    @future(callout=true)
    public static String getReturnedString(String jsonS){
        String returnedString;
        
        Http http1 = new Http();
        HttpRequest request1 = new HttpRequest();
        request1.setEndpoint('エンドポイントURL');
        request1.setMethod('POST');
        request1.setHeader('Content-Type','application/json');
        request1.setBody(jsonS);
        HttpResponse response1 = http1.send(request1);
        if (response1.getStatusCode() == 200 || response1.getStatusCode() == 201) {
            System.debug('API linkage was successful: ' +
                         response1.getStatusCode() + ' ' + response1.getStatus()+ ' ' + response1.getBody());
            Map<String, Object> result1 = (Map<String, Object>)JSON.deserializeUntyped(response1.getBody());
            returnedString = (String)result1.get('returned_string'); 
            
        } else {
            System.debug('The status code returned was not expected: ' +
                         response1.getStatusCode() + ' ' + response1.getStatus()+ ' ' + response1.getBody());
        }
        return returnedString;        
    }
}

Mockクラス

@isTest
global class TestCalloutMock implements HttpCalloutMock {
    global HTTPResponse respond(HTTPRequest request) {
        HttpResponse response = new HttpResponse();
        response.setHeader('Content-Type', 'application/json');
        response.setBody('{"returned_string":"あいうえお"}');
        response.setStatusCode(200);
        return response; 
    }
}

Testクラス

@isTest 
private class TestCalloutTest {
    static testMethod void testPostCallout() {
        Test.setMock(HttpCalloutMock.class, new TestCalloutMock());
        String returnedStr = TestCallout.getReturnedString(jsonS);
    }
}

※記事内容に関係ないので、jsonSの定義は省略しています。