Apexから外部サービスを呼び出すような処理を開発し、いざテストクラスを作成。
あれ・・・テストが失敗している・・?となった。
それもそのはず、Apexテストメソッドは HTTP コールアウトをサポートしていないのである。
そこで、
静的リソースでMockを作成し、StaticResourceCalloutMockを使用してテストクラスを実行する方法を書いていく。
※今回は、Salesforce:Apexから外部サービス呼び出しをする(API)のテストクラスとして作成していく
事前準備
①レスポンスボディを含むテキストファイルを作成。
今回は異常の場合のレスポンス(TestMock_error)と
正常の場合のレスポンス(TestMock_normal)のテキストファイルで計2個。
コンテンツタイプの指定
コンテンツタイプを指定する場合はそのタイプと一致するようにテキストファイルを作成。
例えば、JSON形式の場合は、JSON文字列を書く必要がある。(※ここではJSON形式の場合を想定して書いていく。)
②静的リソースに①で作成したファイルをアップロードする。
実装
今回は、正常のコールアウトと異常のコールアウトの2パターンを実装。
static testMethod void testMethod1() {
/* テスト対象のVisualforcePageとコントローラの設定 */
PageReference testPage = Page.sampleTestPage;
Test.setCurrentPage(testPage);
ObjectName obj = new ObjectName();
TestController TestController = new TestController(new ApexPages.StandardController(obj));
/* コントローラのアクション呼び出し */
TestController.onLoadAction();
/* 異常の疑似レスポンスを作成 */
createMock('TestMock_error');
TestController.inputZipcode1 = '111';
TestController.inputZipcode2 = '1111';
TestController.SearchZipcode();
System.assertEquals(TestController.isError, true);
/* 正常の疑似レスポンスを作成 */
createMock('TestMock_nomal');
TestController.inputZipcode1 = '150';
TestController.inputZipcode2 = '0011';
TestController.SearchZipcode();
System.assertEquals('{"sample":"xxxxxxxxxx"}', res.getBody());
System.assertEquals(200,res.getStatusCode());
System.assertEquals('application/json', res.getHeader('Content-Type'));
}
/* 疑似レスポンスを作成するメソッド */
static void createMock(String mockName){
/* Mock を作成し、プロパティを設定 */
StaticResourceCalloutMock mock = new StaticResourceCalloutMock();
mock.setStaticResource('testMockName');
mock.setStatusCode(200);
mock.setHeader('Content-Type', 'application/json');
/* 擬似コールアウトモードを設定 */
Test.setMock(HttpCalloutMock.class, mock);
}
最後に
JSON形式でテキストファイル作成するの大変だったので、実際にコールアウトした時のレスポンスBodyを画面に描画し、それをコピペして作成しました。
複雑なJSON形式の場合はこうするしかない(笑)
System.debug()で返却値見ようと思ったら、レスポンスが長すぎて全部出てこないのよね・・・