如何测试Guice AbstractModule的实现?

时间:2014-11-03 08:14:49

标签: unit-testing configuration bind guice inject

如何在不创建假实现的情况下在大项目中测试Guice AbstractModule的实现?是否可以测试bind()和inject()方法?

2 个答案:

答案 0 :(得分:8)

通常,测试Guice模块的最佳方法是在测试中创建一个注入器,并确保您可以从中获取您关心的键的实例。

要做到这一点而不会导致生产过程发生,您可能需要用其他模块替换一些模块。您可以使用Modules.override来有选择地覆盖单个绑定,但通常最好不要安装“生产”类型模块并使用伪造绑定。

自Guice 4.0以来,有一个助手类BoundFieldModule可以帮助解决这个问题。我经常设置测试:

public final class MyModuleTest {
  @Bind @Mock DatabaseConnection dbConnection;
  @Bind @Mock SomeOtherDependency someOtherDependency;

  @Inject Provider<MyThing> myThingProvider;

  @Before public void setUp() {
    MockitoAnnotations.initMocks(this);
    Guice.createInjector(new MyModule(), BoundFieldModule.of(this))
        .injectMembers(this);
  }

  @Test public void testCanInjectMyThing() {
    myThingProvider.get();
  }
}

Guice维基上有更多documentation for BoundFieldModule

答案 1 :(得分:0)

您可以通过创建Injector并随后通过调用assertgetInstance()绑定来简单地测试模块实现:

Injector injector = Guice.createInjector(new SomeModule());
assertNotNull(injector.getInstance(SomeSingleton.class));