結合テスト向けGuice補助ライブラリGuiceBerry
GuiceBerryの目的と使い方が分かった気になったので備忘録として書いてみる。GuiceBerryはGuiceを使用しているコードツリー内で、JUnitやTestNGを使用して結合テストを書いている場合、テスト内でのインスタンスの生成の補助をしてくれるライブラリっぽい。ニッチだなぁ・・・。
まず、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付きでフィールドに追加する。テストが少しだけスッキリした。