我正在使用Guice进行使用Mockito和DI的单元测试。我想实现一个允许我在生产和测试模式之间轻松切换的解决方案。我没有找到任何具体的例子,所以我使用我对这些技术的有限知识来实现我的解决方案。
首先我创建了两个AbstractModule
public class ProductionModule extends AbstractModule {
@Override
protected void configure() {
bind(DaoA.class);
bind(DaoB.class);
...
}
}
public class TestModule extends AbstractModule {
@Override
protected void configure() {
bind(DaoA.class).toInstance(Mockito.mock(DaoA.class));
bind(DaoB.class).toInstance(Mockito.mock(DaoB.class));
...
}
}
我的注射器是单身人士
public class GuiceInjector {
private static GuiceInjector instance;
private Injector injector;
private GuiceInjector() { }
public static GuiceInjector getInstance(){
if(instance!=null) return instance;
else{
instance = new GuiceInjector();
}
return instance;
}
public <T> T get(Class<? extends T> cls) {
return injector.getInstance(cls);
}
public void install(AbstractModule module){
injector = Guice.createInjector(module);
}
}
制作模式
所以基本上当应用程序以生产模式启动时,我安装了ProductionModule,然后使用GuiceInjector来获取所有DAO。
GuiceInjector.getInstance().install(new ProductionModule());
测试模式
对于测试部分,我按如下方式设置TestModule,以便所有DAO都被注射器模拟。
@Before
public void setup() {
GuiceInjector.getInstance().install(new TestModule());
}
如果我想调用真正的DAO,我使用
when(DaoA.getSomthing(...)).thenCallRealMethod()
;
使用Mockito和Guice有没有已知/更好的做法?