' P '

whatever I will forget

Apex REST コールアウト

Httpコールアウトをするには

  • 'POST'で、BodyがJsonの場合
    @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...) {
        // logic
    }
}

RESTコールアウトのテスト

  • RestRequestオブジェクトを作成
@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();

        // Assert Logic
        System.assertEqual('value', targetVariable);
    }
}