如何测试 Guice AbstractModule 的实现?

问题描述 投票:0回答:3

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

unit-testing configuration bind guice inject
3个回答
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 wiki 上有更多关于 BoundFieldModule

 文档。


3
投票

您可以简单地通过创建

Injector
来测试模块实现,然后通过调用
assert
getInstance()
绑定:

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

0
投票

对上述解决方案的改进是测试是否绑定了正确的实例:

    class MyModuleTests {
        @Test
        void testDependencies() {
            final var injector = Guice.createInjector(MyModule());
            assertInstanceOf(MyClassImpl.class, injector.getInstance(MyClass.class));

        }
}
© www.soinside.com 2019 - 2024. All rights reserved.