【问题标题】:How to test implementations of Guice AbstractModule?如何测试 Guice AbstractModule 的实现?
【发布时间】:2014-12-29 20:53:02
【问题描述】:

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

【问题讨论】:

  • 你不想测试框架,所以只要相信绑定和注入的 guice 工作正常。如果你想测试你的模块实现,看看 Modules.overwrite,你可以保留你的生产模块并覆盖足够的假/模拟东西,这样你仍然可以轻松地对它们进行单元测试。

标签: unit-testing configuration bind guice inject


【解决方案1】:

通常,测试 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 wiki 上还有更多 documentation for BoundFieldModule

【讨论】:

  • 感谢您的回答。抱歉,我无法解析 BoundFieldModule 类和 @Bind 注释。
  • @Nikolas:你可以通过在测试中创建一个匿名的AbstractModule 子类来做同样的事情,当然——BoundFieldModule 只是一个捷径。 (如果它在您的项目中不可用,您可能需要将 Guice 升级到最新版本。)答案的重要部分是确保您的依赖项正确的最佳方法是在您的测试中创建一个 Injector,并验证它是否按预期工作。
  • @Nikolas 我必须将 guice-testlib 工件添加到 maven 依赖项,它位于 com.google.inject.extensions groupId 下。 4.2.0 版本已在 Maven 中心列出,但只有 4.1.0 会为我下载。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2017-10-18
    相关资源
    最近更新 更多