如何测试Guice AbstractModule的实现?

14
如何在大型项目中测试Guice AbstractModule的实现,而无需创建虚假的实现?是否可以测试bind()和inject()方法?

3
您不想对框架进行测试,因此只需相信Guice的绑定和注入功能正常工作即可。 如果您想测试模块实现,请查看Modules.overwrite,您可以保留生产模块并覆盖足够的虚拟/模拟内容,以便仍然可以轻松地进行单元测试。 - Jan Galinski
2个回答

18

通常测试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绑定字段模块的文档,可以在Guice维基上找到更多信息。


1
谢谢您的回答。很抱歉,我无法解决 BoundFieldModule 类和 @Bind 注释。 - Nikolas
2
@Nikolas:当然,你可以通过在测试中创建一个匿名的AbstractModule子类来完成相同的事情——BoundFieldModule只是一个快捷方式。(如果它在您的项目中不可用,您可能需要将Guice升级到最新版本。)答案的重要部分是,确保依赖项正确的最佳方法是在测试中创建一个Injector,并验证它按预期工作。 - Daniel Pryden
3
@Nikolas 我不得不将 guice-testlib artifact 添加到 Maven 依赖项中,它位于 com.google.inject.extensions groupId 下。版本 4.2.0 在 Maven 中央库中列出,但我只能下载 4.1.0 版本。 - Simply Brian

2

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接