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

Newer Version Available

This content describes an older version of this product. View Latest

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

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

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

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

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

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

メモ

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

1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Test.setMock(WebServiceMock.class, new YourWebServiceMockImpl());

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

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

メモ

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

1swfobject.registerObject("clippy.codeblock-2", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17@isTest
18global class WebServiceMockImpl implements WebServiceMock {
19   global void doInvoke(
20           Object stub,
21           Object request,
22           Map<String, Object> response,
23           String endpoint,
24           String soapAction,
25           String requestName,
26           String responseNS,
27           String responseName,
28           String responseType) {
29       docSample.EchoStringResponse_element respElement = 
30           new docSample.EchoStringResponse_element();
31       respElement.EchoStringResult = 'Mock response';
32       response.put('response_x', respElement); 
33   }
34}

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

1swfobject.registerObject("clippy.codeblock-3", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class WebSvcCallout {
18    public static String callEchoString(String input) {
19        docSample.DocSamplePort sample = new docSample.DocSamplePort();
20        sample.endpoint_x = 'http://api.salesforce.com/foo/bar';
21        
22        // This invokes the EchoString method in the generated class
23        String echo = sample.EchoString(input);
24        
25        return echo;
26    }   
27}

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

1swfobject.registerObject("clippy.codeblock-4", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17@isTest
18private class WebSvcCalloutTest {
19    @isTest static void testEchoString() {              
20        // This causes a fake response to be generated
21        Test.setMock(WebServiceMock.class, new WebServiceMockImpl());
22        
23        // Call the method that invokes a callout
24        String output = WebSvcCallout.callEchoString('Hello World!');
25        
26        // Verify that a fake result is returned
27        System.assertEquals('Mock response', output); 
28    }
29}