複雑なGuiceプロジェクトの場合は、テストを追加して、モジュールを使用してクラスを作成できることを確認する必要があります。あなたの例では、BがGuiceが作成方法を理解できないタイプである場合、GuiceはAを作成できません。Aがサーバーを起動する必要はなかったが、サーバーがリクエスト、それは問題を引き起こすでしょう。
私のプロジェクトでは、重要なモジュールのテストを作成します。モジュールごとに、requireBinding()を使用して、モジュールに必要なバインディングを宣言しますが、定義しません。私のテストでは、テスト対象のモジュールと必要なバインディングを提供する別のモジュールを使用してGuiceインジェクターを作成します。JUnit4とJMockを使用した例を次に示します。
/** Module that provides LoginService */
public class LoginServiceModule extends AbstractModule {
@Override
protected void configure() {
requireBinding(UserDao.class);
}
@Provides
LoginService provideLoginService(UserDao dao) {
...
}
}
@RunWith(JMock.class)
public class LoginServiceModuleTest {
private final Mockery context = new Mockery();
@Test
public void testModule() {
Injector injector = Guice.createInjector(
new LoginServiceModule(), new ModuleDeps());
// next line will throw an exception if dependencies missing
injector.getProvider(LoginService.class);
}
private class ModuleDeps extends AbstractModule {
private final UserDao fakeUserDao;
public ModuleDeps() {
fakeUserDao = context.mock(UserDao.class);
}
@Override
protected void configure() {}
@Provides
Server provideUserDao() {
return fakeUserDao;
}
}
}
テストがプロバイダーのみを要求する方法に注意してください。これは、Guiceがバインディングを解決できるかどうかを判断するのに十分です。LoginServiceがプロバイダーメソッドによって作成された場合、このテストではプロバイダーメソッドのコードはテストされません。
UserDao
このテストでは、正しいものをにバインドしたこと、またはUserDao
スコープが正しく設定されていることもテストされません。これらのタイプのものはめったにチェックする価値がないと主張する人もいます。問題がある場合、それは一度起こります。「恐れが退屈になるまでテストする」必要があります。
モジュールテストは、新しいインジェクションポイントを追加することが多く、バインディングを追加するのを忘れがちなので、便利だと思います。
このrequireBinding()
呼び出しは、Guiceがインジェクターを返す前に、欠落しているバインディングをキャッチするのに役立ちます。requireBinding()
上記の例では、呼び出しがない場合でもテストは機能しますが、ドキュメントとして機能するため、呼び出しが必要です。
より複雑なモジュール(ルートモジュールなど)の場合、Modules.override()を使用して、テスト時に不要なバインディングをオーバーライドできます(たとえば、ルートオブジェクトが作成されることを確認したい場合は、おそらくデータベースに接続するオブジェクトを作成したくない)。単純なプロジェクトの場合は、最上位モジュールのみをテストできます。
フィールドに注釈が付けられていない限り、Guiceはnullを挿入@Nullable
しないため、テストで挿入されたオブジェクトがnullでないことを確認する必要はほとんどありません。実際、コンストラクターに注釈を付けるときは@Inject
、パラメーターが正しいかどうかをわざわざチェックする必要はありませんnull
(実際、null
テストを単純にするために、テストはコンストラクターに挿入されることがよくあります)。