結合テスト向けGuice補助ライブラリGuiceBerry

GuiceBerryの目的と使い方が分かった気になったので備忘録として書いてみる。GuiceBerryはGuiceを使用しているコードツリー内で、JUnitTestNGを使用して結合テストを書いている場合、テスト内でのインスタンスの生成の補助をしてくれるライブラリっぽい。ニッチだなぁ・・・。

まず、GuiceBerryを使わない場合の結合テストの例。自分の作っているQMACloneから抜粋。

@RunWith(JUnit4.class)
public class ChatManagerTest {
  private ChatManager manager;

  @Before
  public void setUp() throws Exception {
    manager = Guice.createInjector(new QMACloneModule()).getInstance(ChatManager.class);
  }

  @Test
  public void testWriteRead() {
    PacketChatData expected = new PacketChatData();
    expected.body = "body";

    manager.write(expected, "1.2.3.4");

    PacketChatDataList list = manager.read(0);
    PacketChatData actual = list.list.get(list.list.size() - 1);

    assertEquals(expected.body, actual.body);
  }

  @Test
  public void testGetChatDataListWebSocket() {
    assertNotNull(manager.getChatDataListWebSocket());
  }
}

ここではChatManagerクラスを手えすとしようとしている。setUp()で毎回GuiceのInjectorを作成して、ChatManagerクラスを生成している。ちょっとかっこ悪い気がする。これをGuiceBerryを使って書き直すとこうなる。

public class QMACloneTestEnv extends AbstractModule {
  @Override
  protected void configure() {
    install(new GuiceBerryModule());
    install(new QMACloneModule());
  }
}

@RunWith(JUnit4.class)
public class ChatManagerTest {
  @Rule
  public final GuiceBerryRule rule = new GuiceBerryRule(QMACloneTestEnv.class);
  @Inject
  private ChatManager manager;

  @Test
  public void testWriteRead() {
    PacketChatData expected = new PacketChatData();
    expected.body = "body";

    manager.write(expected, "1.2.3.4");

    PacketChatDataList list = manager.read(0);
    PacketChatData actual = list.list.get(list.list.size() - 1);

    assertEquals(expected.body, actual.body);
  }

  @Test
  public void testGetChatDataListWebSocket() {
    assertNotNull(manager.getChatDataListWebSocket());
  }
}

GuiceBerry用のGuiceモジュール(Env)を定義し、GuiceBerryModuleとテストに使いたいモジュールをインストールする。次にテスト本体に@Rule付きでGuiceBerryRuleのフィールドを追加して、先ほど作ったEnvを指定する。最後にテストしたいクラスを@Inject付きでフィールドに追加する。テストが少しだけスッキリした。