この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Web サービスコールアウトのテスト

生成されたコードは、Web サービスをコールするために呼び出せるメソッドが含まれる Apex クラスとして保存されます。この Apex クラスと付随するその他のコードをリリースまたはパッケージ化するには、生成されたクラス内のメソッドを含め、コードのテストカバー率が 75% に達している必要があります。デフォルトでは、テストメソッドは Web サービスコールアウトをサポートせず、Web サービスコールアウトを実行するテストは失敗します。テストの失敗を回避し、コードカバー率を高めるために、Apex には組み込みの WebServiceMock インターフェースと Test.setMock メソッドが用意されています。WebServiceMock および Test.setMock を使用して、テストメソッドで疑似応答を受信します。

Web サービスコールアウトをテストするための擬似応答の指定

WSDL から Apex クラスを作成した場合、自動生成されたクラスのメソッドが WebServiceCallout.invoke をコールし、そこから外部サービスへのコールアウトが実行されます。これらのメソッドをテストする場合、WebServiceCallout.invoke がコールされたときには常に擬似応答を生成するように Apex ランタイムに指示できます。そのためには、WebServiceMock インターフェースを実装し、送信する Apex ランタイムの擬似応答を指定します。手順の詳細は次のとおりです。

最初に、WebServiceMock インターフェースを実装し、doInvoke メソッドに擬似応答を指定します。

1global class YourWebServiceMockImpl implements WebServiceMock {
2   global void doInvoke(
3           Object stub,
4           Object request,
5           Map<String, Object> response,
6           String endpoint,
7           String soapAction,
8           String requestName,
9           String responseNS,
10           String responseName,
11           String responseType) {
12
13        // Create response element from the autogenerated class.
14        // Populate response element.
15        // Add response element to the response parameter, as follows:
16        response.put('response_x', responseElement); 
17   }
18}
  • WebServiceMock インターフェースを実装するクラスは、global または public にできます。
  • このクラスはテストコンテキストでのみ使用されるため、@isTest のアノテーションを付加できます。この方法で、3 MB の組織コードサイズ制限からクラスを除外できます。

メモ

擬似応答の値を指定したら、テストメソッドで Test.setMock をコールし、この擬似応答を送信するように Apex ランタイムに指示できます。次のように、第 1 引数では WebServiceMock.class を渡し、第 2 引数では WebServiceMock のインターフェース実装の新しいインスタンスを渡します。

1Test.setMock(WebServiceMock.class, new YourWebServiceMockImpl());

これ以降、Web サービスコールアウトをテストコンテキストで呼び出すと、コールアウトは行われません。doInvoke メソッド実装で指定した擬似応答を受信します。

コールアウトを実行するコードが管理パッケージに含まれる場合に疑似コールアウトを行うには、同じパッケージ内のテストメソッドから同じ名前空間を使用して Test.setMock をコールします。

メモ

この例では、Web サービスコールアウトをテストする方法を示します。最初に挙げているのが、WebServiceMock インターフェースの実装です。この例では doInvoke メソッドを実装し、そのメソッドから指定した応答が返されます。この場合、自動生成されたクラスのレスポンス要素が作成されて値が割り当てられます。次に、応答の Map パラメータにこの擬似応答が入力されます。次の例は、「生成される WSDL2Apex コード」 に記されている WSDL に基づいています。このクラスを保存する前に、この WSDL をインポートし、docSample というクラスを生成しておきます。

1@isTest
2global class WebServiceMockImpl implements WebServiceMock {
3   global void doInvoke(
4           Object stub,
5           Object request,
6           Map<String, Object> response,
7           String endpoint,
8           String soapAction,
9           String requestName,
10           String responseNS,
11           String responseName,
12           String responseType) {
13       docSample.EchoStringResponse_element respElement = 
14           new docSample.EchoStringResponse_element();
15       respElement.EchoStringResult = 'Mock response';
16       response.put('response_x', respElement); 
17   }
18}

次のメソッドでは、Web サービスコールアウトを行います。

1public class WebSvcCallout {
2    public static String callEchoString(String input) {
3        docSample.DocSamplePort sample = new docSample.DocSamplePort();
4        sample.endpoint_x = 'http://api.salesforce.com/foo/bar';
5        
6        // This invokes the EchoString method in the generated class
7        String echo = sample.EchoString(input);
8        
9        return echo;
10    }   
11}

次のテストクラスには、擬似コールアウトモードを設定するテストメソッドが含まれます。これは前述のクラスに含まれる callEchoString メソッドをコールし、擬似応答が受信されたことを確認します。

1@isTest
2private class WebSvcCalloutTest {
3    @isTest static void testEchoString() {              
4        // This causes a fake response to be generated
5        Test.setMock(WebServiceMock.class, new WebServiceMockImpl());
6        
7        // Call the method that invokes a callout
8        String output = WebSvcCallout.callEchoString('Hello World!');
9        
10        // Verify that a fake result is returned
11        System.assertEquals('Mock response', output); 
12    }
13}