REST コールアウトのテスト
trailheadのとおり、Mockを作る
Apex REST コールアウト 単元 | Salesforce Trailhead
要件にHttpCalloutMockを使うとあるのでそのとおりにすればよいが、模擬データとなるJSONの作成が けっこう面倒くさい ので、リクエスト先のJSONデータを静的リソースとして保存して使うことにした。
ちなみに(このChallengeでは使えないが)静的リソースを使う場合はStaticResourceCalloutMock
を使うこともできる。はず。
静的リソースの作成
File→new→Static Resourceと選択
MIME Type: text/plain
コールアウト先の情報を全部コピー&ペーストして保存。
データをStringとして取得するには
- StaticResourceオブジェクトとして取得
- Bodyを参照してStringに変換
StaticResourceオブジェクトにSOQLを使ってリソースの取得を行うことができる。
StaticResource sr=[SELECT id,Name,Body,ContentType
FROM StaticResource
WHERE Name='filename'
LIMIT 1];
//Name:ファイル名(拡張子なし)
//Body:本文
//ContentType:MIME/Type。今回はtext/plain
拡張子による区別もしたいならContentType
を使えばできそう(未検証)
StaticResource.Body
にファイル本文のデータが入っているのでStringに変換する。
参考
- 静的リソースの利用方法(Apex、Visualforce、カスタムボタン) | Xgeek
- StaticResource | SOAP API 開発者ガイド | Salesforce Developers
#ソースコード
※静的リソースは省略
WarehouseCalloutServiceMock
コード
@isTest
global class WarehouseCalloutServiceMock implements HttpCalloutMock{
// implement http mock callout
global HTTPResponse respond(HTTPRequest request){
HttpResponse response =new HttpResponse();
response.setHeader('Content-Type', 'application/json');
//saved 'warehouseJSON.txt' as static resource
StaticResource staticResource=[SELECT Body
FROM StaticResource
WHERE Name='warehouseJSON' LIMIT 1];
response.setBody(staticResource.Body.toString());
response.setStatusCode(200);
return response;
}
}
WarehouseCalloutServiceTest
例のごとくassertする必要がないので、ひとまずCheck抜けるために作成。
assert要になった模様
コード
@isTest
private class WarehouseCalloutServiceTest {
// implement your mock callout test here
@isTest static void testWarehouseCalloutService(){
Test.setMock(HttpCalloutMock.class,new WarehouseCalloutServiceMock());
WarehouseCalloutService.runWarehouseEquipmentSync();
}
}