在我的应用程序中,我使用FactoryModuleBuilder自动创建某个类的实例:
new AbstractModule() {
@Override
protected void configure() {
install(new FactoryModuleBuilder().implement(A.class,B.class).build(A.AFactory.class));
}
});
在我的测试中,我真的不想使用实现(B类),所以我想配置一个模块,以便工厂返回一个像这样的Mockito模拟:
new AbstractModule() {
@Override
protected void configure() {
install(new FactoryModuleBuilder().implement(A.class,myMockInstance).build(A.AFactory.class));
}
});
显然上面的内容没有意义,因为呢()告诉我应该将哪个实现用于接口A,但是我希望它能让我明白我希望创建的工厂使用我的模拟对象。然后我就像往常一样使用我的模拟器:
Mockito.when(myMockInstance.doStuff()).thenReturn(result);
这是可能的还是我必须手动创建一个实现A的C类,它将充当模拟器?
答案 0 :(得分:5)
为什么要使用FactoryModuleBuilder?它存在以自动处理从@Assisted
到A.AFactory
的构造函数的B
参数,但在测试中您不需要 - 尤其是在工厂返回模拟时。相反,嘲笑你自己的A.AFactory
,并通过Guice访问它。
final A myMockInstance = createAMock();
new AbstractModule() {
@Override protected void configure() {}
@Provides
A.AFactory createAFactory() {
A.AFactory factory = mock(A.AFactory.class);
when(factory.createA(anyString(), anyInt(), any(Dependency.class)))
.thenReturn(myMockInstance);
return factory;
}
});
我在这里使用了@Provides
方法,但您可以轻松编写自己的五行A.AFactory
,然后使用bind(A.AFactory.class).to(AFactoryForTest.class)
进行绑定,或者在其他位置设置模拟工厂,{ {1}}。