Newer Version Available
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}擬似応答の値を指定したら、テストメソッドで 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 メソッド実装に指定した擬似応答を受信します。
次の詳細な例では、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}