如何测试Guice AbstractModule的实现?

Nik*_*las 9 configuration unit-testing bind inject guice

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

Dan*_*den 10

通常,测试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();
  }
}
Run Code Online (Sandbox Code Playgroud)

有关Guice wiki 的更多文档BoundFieldModule.

  • @Nikolas:您可以通过在测试中创建一个匿名的AbstractModule子类来做同样的事情,当然,BoundFieldModule只是一个快捷方式。(如果您的项目中没有此功能,则可能需要将Guice升级到最新版本。)答案的重要部分是,确保依赖关系正确的最佳方法是在测试中创建一个“注入器”,并验证它是否按预期工作。 (2认同)
  • @Nikolas我必须将guice-testlib工件添加到Maven附属机构中,它在com.google.inject.extensions groupId下。Maven Central上列出了版本4.2.0,但是只有4.1.0可以为我下载。 (2认同)