Web サービスコールアウトのテスト
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}擬似応答の値を指定したら、テストメソッドで Test.setMock をコールし、この擬似応答を送信するように Apex ランタイムに指示できます。次のように、第 1 引数では WebServiceMock.class を渡し、第 2 引数では WebServiceMock のインターフェース実装の新しいインスタンスを渡します。
1Test.setMock(WebServiceMock.class, new YourWebServiceMockImpl());これ以降、Web サービスコールアウトをテストコンテキストで呼び出すと、コールアウトは行われません。doInvoke メソッド実装で指定した擬似応答を受信します。
この例では、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 = 'https://example.com/example/test';
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}