Httpコールアウトをするには
@Future(callout=true)
private static void postToPMS(String serviceToken, String jsonInput, Id targetOppId){
HTTPRequest req = new HTTPRequest();
req.setEndPoint('callout:ProjectService');
req.setMethod('POST');
req.setHeader('token',serviceToken);
req.setHeader('Content-Type', 'application/json;charset=UTF-8');
req.setBody(jsonInput);
HTTP http = new HTTP();
HTTPResponse res = http.send(req);
Opportunity opp = new Opportunity(Id=targetOppId);
if(res.getStatusCode() == 201){
opp.StageName = 'Submitted Project';
System.debug('Success: ' + res.getStatus());
}else{
opp.StageName = 'Resubmit Project';
System.debug('Failure: ' + res.getStatusCode() + ' ' + res.getStatus());
}
update opp;
}
HttpCalloutMock を使用したコールアウトのテスト
- POST コールアウトのテストのために、
HttpCalloutMock
インターフェースの実装が用意されている
Web サービスコールアウトのテスト
- コードカバー率には
WSDL2Apex
で生成されたクラスも含まれる
- コードカバー率を高めるために、組み込みの
WebServiceMock
インターフェースと Test.setMock
が用意されている
コールアウトの疑似応答の指定
- WSDL から Apex クラスを作成した場合、自動生成されたクラスのメソッドが
WebServiceCallout.invoke
をコールし、そこから外部サービスへのコールアウトが実行される
WebServiceCallout.invoke(
this,
request_x,
response_map_x,
new String[]{endpoint_x,
'',
'http://calculator.services/',
'doAdd',
'http://calculator.services/',
'doAddResponse',
'calculatorServices.doAddResponse'}
);
- 上記のメソッドをテストする場合、
WebServiceMock
インターフェースを使用し、常に疑似応答を生成するように Apex ランタイムに指示できる
- テストメソッドで
Test.setMock
をコールしてこの疑似応答を送信するように Apex ランタイムに指示する
- 第 1 引数で、
WebServiceMock.class
を渡す。第 2 引数では、WebServiceMock
インターフェース実装の新しいインスタンスを渡す
Test.setMock(WebServiceMock.class, new MyWebServiceMockImpl());
概要
RESTコールアウト
@RestResource(urlMapping='/project/*')
global class ProjectRESTService {
@HttpPost
global static String postProjectData(String xxx...) {
}
}
RESTコールアウトのテスト
@isTest
private class ProjectRESTServiceTest {
@TestSetup
static void makeData(){
Account acc = new Account(Name = 'TestAcc');
insert acc;
Opportunity opp = new Opportunity(AccountId = acc.Id,
Name = 'Test opp',
Type = 'New Project',
CloseDate = Date.today(),
StageName = 'Prospecting',
Amount = 12345);
insert opp;
}
static void ProjectRESTServiceTestSuccess() {
Opportunity opp = [SELECT Id, DeliveryInstallationStatus__c FROM Opportunity WHERE Name = 'Test opp'];
RestRequest req = new RestRequest();
req.httpMethod = 'POST';
req.requestURI = 'service/apexrest/project';
RestContext.request = req;
Test.startTest();
String res = ProjectRESTService.postProjectData('ProjectRef',
'ProjectName',
opp.Id,
Date.today(),
Date.today().addDays(1),
12345,
'Running');
Test.stopTest();
System.assertEqual('value', targetVariable);
}
}