Newer Version Available
静的リソースを使用した HTTP コールアウトのテスト
受信するレスポンスボディを静的リソース内に指定し、2 つの組み込みクラス (StaticResourceCalloutMock または MultiStaticResourceCalloutMock) のいずれかを使用することで、HTTP コールアウトをテストできます。
StaticResourceCalloutMock を使用した HTTP コールアウトのテスト
Apex には、静的リソースでレスポンスボディを指定することでコールアウトのテストに使用できる、組み込み StaticResourceCalloutMock クラスが用意されています。このクラスを使用する場合、HttpCalloutMock インターフェースを独自に実装する必要ありません。代わりに、単に StaticResourceCalloutMock のインスタンスを作成し、レスポンスボディに使用する静的リソースを応答の他のプロパティ (状況コードやコンテンツタイプなど) と共に設定します。
- 返すレスポンスボディを含むテキストファイルを作成します。レスポンスボディには任意の文字列を使用できますが、コンテンツタイプを指定した場合はそのタイプと一致する必要があります。たとえば、応答にコンテンツタイプを指定しない場合、ファイルには任意の文字列 abc を含めることができます。応答に application/json の��ンテンツタイプを指定した場合、ファイルコンテンツは {"hah":"fooled you"} などの JSON 文字列にする必要があります。
- このテキストファイル用の静的リソースを作成します。
- をクリックして、[新規静的リソース] をクリックします。
- 静的リソースに名前を付けます。
- アップロードするファイルを選択します。
- [保存] をクリックします。
静的リソースについての詳細は、Salesforce オンラインヘルプの「静的リソースの定義」を参照してください。
次に、StaticResourceCalloutMock のインスタンスを作成し、静的リソースとその他のプロパティを設定します。
1swfobject.registerObject("clippy.codeblock-0", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17StaticResourceCalloutMock mock = new StaticResourceCalloutMock();
18mock.setStaticResource('myStaticResourceName');
19mock.setStatusCode(200);
20mock.setHeader('Content-Type', 'application/json');テストメソッドで、Test.setMock をコールして擬似コールアウトモードを設定し、最初の引数として HttpCalloutMock.class、2 番目の引数として StaticResourceCalloutMock 用に作成した変数名を渡します。
1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Test.setMock(HttpCalloutMock.class, mock);これ以降テストメソッドでコールアウトを実行しようとすると、コールアウトは実行されず、Apex ランタイムが StaticResourceCalloutMock のインスタンスで指定した擬似応答を送信します。
次の詳細な例には、テストメソッド (testCalloutWithStaticResources) が含まれ、このメソッドで、コールアウトを実行する getInfoFromExternalService をテストします。この例を実行する前に、コンテンツ {"hah":"fooled you"} を含むテキストファイルに基づいた mockResponse という名前の静的リソースを作成します。各クラスを個別に保存して、CalloutStaticClassTest でテストを実行します。
1swfobject.registerObject("clippy.codeblock-2", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class CalloutStaticClass {
18 public static HttpResponse getInfoFromExternalService(String endpoint) {
19 HttpRequest req = new HttpRequest();
20 req.setEndpoint(endpoint);
21 req.setMethod('GET');
22 Http h = new Http();
23 HttpResponse res = h.send(req);
24 return res;
25 }
26}1swfobject.registerObject("clippy.codeblock-3", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17@isTest
18private class CalloutStaticClassTest {
19 @isTest static void testCalloutWithStaticResources() {
20 // Use StaticResourceCalloutMock built-in class to
21 // specify fake response and include response body
22 // in a static resource.
23 StaticResourceCalloutMock mock = new StaticResourceCalloutMock();
24 mock.setStaticResource('mockResponse');
25 mock.setStatusCode(200);
26 mock.setHeader('Content-Type', 'application/json');
27
28 // Set the mock callout mode
29 Test.setMock(HttpCalloutMock.class, mock);
30
31 // Call the method that performs the callout
32 HTTPResponse res = CalloutStaticClass.getInfoFromExternalService(
33 'http://api.salesforce.com/foo/bar');
34
35 // Verify response received contains values returned by
36 // the mock response.
37 // This is the content of the static resource.
38 System.assertEquals('{"hah":"fooled you"}', res.getBody());
39 System.assertEquals(200,res.getStatusCode());
40 System.assertEquals('application/json', res.getHeader('Content-Type'));
41 }
42}MultiStaticResourceCalloutMock を使用した HTTP コールアウトのテスト
Apex には、各エンドポイントの静的リソースでレスポンスボディを指定することでコールアウトのテストに使用できる、組み込み MultiStaticResourceCalloutMock クラスが用意されています。このクラスは、複数のレスポンスボディを指定できること以外は StaticResourceCalloutMock と似ています。このクラスを使用する場合、HttpCalloutMock インターフェースを独自に実装する必要ありません。代わりに、単に MultiStaticResourceCalloutMock のインスタンスを作成し、エンドポイントごとに使用する静的リソースを設定します。状況コードやコンテンツタイプなどの応答の他のプロパティも設定できます。
最初に、レスポンスボディを含めるテキストファイルから静的リソースを作成する必要があります。「StaticResourceCalloutMock を使用した HTTP コールアウトのテスト」に示された手順を参照してください。
次に、MultiStaticResourceCalloutMock のインスタンスを作成し、静的リソースとその他のプロパティを設定します。
1swfobject.registerObject("clippy.codeblock-4", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17MultiStaticResourceCalloutMock multimock = new MultiStaticResourceCalloutMock();
18multimock.setStaticResource('http://api.salesforce.com/foo/bar', 'mockResponse');
19multimock.setStaticResource('http://api.salesforce.com/foo/sfdc', 'mockResponse2');
20multimock.setStatusCode(200);
21multimock.setHeader('Content-Type', 'application/json');テストメソッドで、Test.setMock をコールして擬似コールアウトモードを設定し、最初の引数として HttpCalloutMock.class、2 番目の引数として MultiStaticResourceCalloutMock 用に作成した変数名を渡します。
1swfobject.registerObject("clippy.codeblock-5", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Test.setMock(HttpCalloutMock.class, multimock);これ以降テストメソッドで http://api.salesforce.com/foo/bar または http://api.salesforce.com/foo/sfdc のいずれかのエンドポイントへの HTTP コールアウトを実行しようとすると、コールアウトは実行されず、Apex ランタイムが MultiStaticResourceCalloutMock のインスタンスで指定した対応する擬似応答を送信します。
次の詳細な例には、テストメソッド (testCalloutWithMultipleStaticResources) が含まれ、このメソッドで、コールアウトを実行する getInfoFromExternalService をテストします。この例を実行する前に、コンテンツ {"hah":"fooled you"} を含むテキストファイルに基づいた mockResponse という名前の静的リソースと、コンテンツ {"hah":"fooled you twice"} を含むテキストファイルに基づいた mockResponse2 という名前の静的リソースを作成します。各クラスを個別に保存して、CalloutMultiStaticClassTest でテストを実行します。
1swfobject.registerObject("clippy.codeblock-6", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class CalloutMultiStaticClass {
18 public static HttpResponse getInfoFromExternalService(String endpoint) {
19 HttpRequest req = new HttpRequest();
20 req.setEndpoint(endpoint);
21 req.setMethod('GET');
22 Http h = new Http();
23 HttpResponse res = h.send(req);
24 return res;
25 }
26}1swfobject.registerObject("clippy.codeblock-7", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17@isTest
18private class CalloutMultiStaticClassTest {
19 @isTest static void testCalloutWithMultipleStaticResources() {
20 // Use MultiStaticResourceCalloutMock to
21 // specify fake response for a certain endpoint and
22 // include response body in a static resource.
23 MultiStaticResourceCalloutMock multimock = new MultiStaticResourceCalloutMock();
24 multimock.setStaticResource(
25 'http://api.salesforce.com/foo/bar', 'mockResponse');
26 multimock.setStaticResource(
27 'http://api.salesforce.com/foo/sfdc', 'mockResponse2');
28 multimock.setStatusCode(200);
29 multimock.setHeader('Content-Type', 'application/json');
30
31 // Set the mock callout mode
32 Test.setMock(HttpCalloutMock.class, multimock);
33
34 // Call the method for the first endpoint
35 HTTPResponse res = CalloutMultiStaticClass.getInfoFromExternalService(
36 'http://api.salesforce.com/foo/bar');
37 // Verify response received
38 System.assertEquals('{"hah":"fooled you"}', res.getBody());
39
40 // Call the method for the second endpoint
41 HTTPResponse res2 = CalloutMultiStaticClass.getInfoFromExternalService(
42 'http://api.salesforce.com/foo/sfdc');
43 // Verify response received
44 System.assertEquals('{"hah":"fooled you twice"}', res2.getBody());
45 }
46}