如何在大型项目中测试Guice AbstractModule的实现,而无需创建虚假的实现?是否可以测试bind()和inject()方法?
通常测试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维基上找到更多信息。
AbstractModule
子类来完成相同的事情——BoundFieldModule
只是一个快捷方式。(如果它在您的项目中不可用,您可能需要将Guice升级到最新版本。)答案的重要部分是,确保依赖项正确的最佳方法是在测试中创建一个Injector
,并验证它按预期工作。 - Daniel Pryden您可以通过创建 Injector
然后调用getInstance()
来简单地测试模块实现并通过assert
绑定:
Injector injector = Guice.createInjector(new SomeModule());
assertNotNull(injector.getInstance(SomeSingleton.class));