tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:HTTP Calloutsのテスト

ApexクラスでHTTP Calloutsの処理を行っている場合、普通にテストクラスを作ろうとすると次のようなエラーが発生して処理がスキップされてしまいます。

f:id:tyoshikawa1106:20130908204018p:plain

HTTP Calloutsのテストクラスを作成するには"implements HttpCalloutMock"を宣言したクラスが必要になります。これを用意してテストクラス内で次ような宣言で呼び出すことで擬似的なHTTP Calloutsの結果を取得することができるとのことです。

Test.setMock(HttpCalloutMock.class, new MockHttpResponseGenerator());

サンプルです。

"implements HttpCalloutMock"のクラスは@isTestを宣言することでApex 使用率の制限から除外することができます。

この方法でHTTP Calloutsの処理をスキップさせずにテストすることができます。
f:id:tyoshikawa1106:20130908204614p:plain


この方法の詳細についてはこちらです。

Testing HTTP Callouts by Implementing the HttpCalloutMock Interface
http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_classes_restful_http_testing_httpcalloutmock.htm


HTTP Calloutsのテストを行う方法はもうひとつあります。
"implements HttpCalloutMock"のクラスを用意するのではなく静的リソースに用意して呼び出す方法です。


まず静的リソースにファイルをアップロードします。
f:id:tyoshikawa1106:20130908212913p:plain

ファイルの中身はおそらくこんな感じ
f:id:tyoshikawa1106:20130908212930p:plain

ファイル拡張子は.jsonだと思います。
静的リソースのMIMEタイプはapplication/jsonになる予定だったのですがうまくいきませんでした。

テストクラス内で次のように宣言して静的リソースからファイルを呼び出します。

StaticResourceCalloutMock mock = new StaticResourceCalloutMock();

これで"Test.setMock"を宣言できるようになります。

サンプルです。

これで一応テストクラスを通すことはできました。
f:id:tyoshikawa1106:20130908213322p:plain

ただMIMEタイプとかその他うまく行っていない感じのところがあるので、ちょっと間違えている箇所があるみたいです。


ひとまず静的リソースを使ったHTTP Calloutsはこんな感じになります。
この方法についての詳細はこちらになります。

Testing HTTP Callouts Using Static Resources
http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_classes_restful_http_testing_static.htm

それとこちらも参考になりそうでした。

Testing HTTP Callouts with Static Data in Winter'13
http://blogs.developerforce.com/developer-relations/2012/10/testing-http-callouts-with-static-data-in-winter-13.html


HTTP Calloutsのテストは"implements HttpCalloutMock"と"静的リソース"の2種類の方法が用意されています。個人的には"implements HttpCalloutMock"の方が使いやすい気がしました。@isTestを宣言することで制限からも除外できるのも良いと思います。