2012年3月7日水曜日

Slim3 Source Code Reading #11

昨日、Slim3 Source Code Reading #11でした。

今回もtesterパッケージを読みました。
今回はMockXXX.javaとHeaderUtil.java、UrlFetchHandler.javaでした。

MockXXX.javaに関しては、リクエスト、レスポンスを擬似的に再現するための
もので、中身もgetter/setterばかりで特にこれといったものはありませんでした。

ただし、MockHttpServletRequestに関してはHeaderなども変更できるようなので、
例えばjsonのリクエストをテストする場合は事前にHeaderを書き換えた状態で
テストを行うことも可能な感じがしました。
後は、cron jobの実行だとヘッダに”X-AppEngine-Cron: true”が付く事に
なっていますから、手動で実行した時は無視する処理をいれている場合は
Controllerの実行前にHeaderを追加してからテストするという事も
可能だと思います。

HeaderUtilも時刻のフォーマットが定義されているだけで、これも直接利用する事は
無さそうです。

UrlFetchHandlerはinterfaceで、中身を自分で実装する必要があります。
Slim3Demoにもこのクラスを使ったDemoは存在していないようなので、
そもそも利用していないのか?という話になりました。

本題に移ると、これは実際に動作の確認はしていませんが、
アプリケーションでGoogle App EngineのURL Fetch APIを利用した時の
外部サイトのテストで使うために利用するようです。
interfaceを実装する形になりますから、テストデータは自由に作ることができます。

恐らく、以下のようなテストコードになると思います。※以下のコードは未検証です。

@Test
public void URLFetchAPIを使うコントローラのテスト() throws Exception {
    tester.setUrlFetchHandler(new HogeUrlFetchHandler());

    tester.start("/urlfetchsample/");
    AddController controller = tester.getController();
    assertThat(controller, is(notNullValue()));
    assertThat(tester.isRedirect(), is(true));
    assertThat(tester.getDestinationPath(), is("/"));
}

URL Fetch API用のHandlerオブジェクト ※以下のコードは未検証です。
public class HogeUrlFetchHandler() implements UrlFetchHandler {
    public byte[] getContent(URLFetchRequest request) throws IOException {
        String strResponse = "何かのデータ";

        return strResponse.getBytes("UTF-8");
    }

    public int getStatusCode(URLFetchRequest request) throws IOException {
         return HttpServletResponse.SC_OK;
    }
}

昨日の段階では「これを利用する事はあるかな?」という話になりましたが、
既に動作中のWebAPIでテストを行う場合は、URLFetchHandlerは
不要なのかもしれませんが、
動作中のAPIだと実行時点でデータが変わったりするのでテストの結果が
実行するたびに変わってしまうという結果に陥りそうなので
作るべきかな?と思ったりしています。

あとは、WebAPIも作成途中でテストデータが無いと言った時も利用することに
なるでしょう。

今回は中身も大した内容ではなかったので、テストコードをどれくらい書くか?
みたいな話題になりました。
(読書会での結論は「不安な所をテストする」と言われているので、「不安がなくなるまで書け」ば良いようです。)

さて、次回(#12)はorg.slim3.controller.routerを読んで、最終回となります。
ご興味がありましたら、ご参加下さい。