Hatena::ブログ(Diary)

Kazzzの日記 このページをアンテナに追加 RSSフィード

2014-09-15

[]ChannelServiceをローカルテストする

開発中のGAE/JのサービスではSlim3を使用している。
Slim3にはAppTester(ControllerTester)(ServletTester)と呼ばれるGAEのサービスを包含するテスタークラスが用意されており、これを保持したテストケースクラスを書くだけでGAEの各種サービスをローカルでテストできるのだが、少し設計が古くSlim3の開発時にはなかったサービス等は含まれていない。

ChannelServiceも同テスターには含まれていないので、これをテストするにはGoogleが提供しているLocal〜TestConfigと呼ばれるローカルテスト用のクラスを使う必要がある。(〜にはサービス毎に用意されている※)

ChannelServiceをテストするユニットテストクラス (LocalServiceTestCase.java)
private LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalChannelServiceTestConfig());
private ChannelManager channelManager;

@Before
public void setUp() {
    helper.setUp();
    channelManager = LocalChannelServiceTestConfig.getLocalChannelService().getChannelManager();
}
@After
public void tearDown() {
    helper.tearDown();
}
@Test
public void testSendMessage() {
    //クライアントを識別する一位の文字列でトークン生成(ここではUUID乱数を使用)
    String token = channelService.createChannel(UUID.randomUUID().toString());
    //クライアントからの接続をエミュレート
    String clientId = channelManager.connectClient(token); 
    service.sendMessage(token, "テストメッセージ");
    //送信されるであろうメッセージをアサートする
    String message = channelManager.getNextClientMessage(token, clientId );
    assertThat("テストメッセージ", equalTo(message));
}

実際のコードでは使用しないChannelManagerクラスにより、クライアント(Webブラウザ)側から接続エミュレートできるのがミソ。

本当ならここでこの機能をSlim3のAppTesterに組み込むべきなのだが、時間が無い。折を見て組み込もうと思っている。

※LocalBlobstoreServiceTestConfig, LocalTaskQueueTestConfigなど、全てのサービスのローカルテスト用クラスが用意されている。
https://developers.google.com/appengine/docs/java/tools/localunittesting/javadoc/com/google/appengine/tools/development/testing/LocalServiceTestConfig