我有一个maven项目javaruntime和一个androidruntime依赖于javaruntime项目的maven 项目.每个项目都有一个Guice-Module将一些类绑定到Interfaces.
在javaruntime接口IElementFactory和类C中获取IElementFactory构造函数注入:
public class C {
@Inject
public C(IElementFactory factory, ...(other interfaces)...) {...}
// ...
}
Run Code Online (Sandbox Code Playgroud)
该项目的具体实施IElementFactory是在androidruntime项目中并被调用AndroidElementFactory.其他接口的所有实现都在javaruntime.
在javaruntime我有JUnit测试应该使用一个MockElementFactory因为它不知道androidruntime.
如果我将模块绑定IElementFactrory到AndroidElementFactory唯一androidruntime模块,那么测试当然会失败,因为javaruntime模块/项目中没有为该接口绑定任何实现.
如果我然后绑定MockElementFactory的javaruntime模块测试都很好,但我不能编译androidruntime,因为IElementFactory已经被绑定到MockElementFactory并覆盖有约束力较差,在吉斯不reommended.
但是我如何才能实现Mock用于测试,而在android-project中仍然可以绑定正确的实现?
首先,事实上你不想这样做.当你对你的班级进行单元测试时,特别是对于模拟,你不应该使用Guice.相反,您应该直接实例化您的类,为其提供所有依赖项.由于您正在编写单元测试,因此这不应该是一个问题,因为测试中的所有依赖项应该是微不足道的或被嘲笑.
但是如果你真的想要做你想做的事情,你必须将你的程序分成几个模块.为简单起见,让他们成为MainModule,MockModule和AndroidModule.在MainModule您配置所有绑定除外IElementFactory.它看起来像这样:
public class MainModule extends AbstractModule {
@Override
protected void configure() {
// Require presence of IElementFactory
requireBinding(IElementFactory.class);
// Bind all other dependencies
...
}
}
Run Code Online (Sandbox Code Playgroud)
在你MockModule和AndroidModule你绑定相应的实现IElementFactory.
然后在测试中,您可以像这样创建注入器:
Injector injector = Guice.createInjector(new MainModule(), new MockModule());
Run Code Online (Sandbox Code Playgroud)
在android项目中你创建它像这样:
Injector injector = Guice.createInjector(new MainModule(), new AndroidModule());
Run Code Online (Sandbox Code Playgroud)
如果你不能这样做因为注入器实例化是硬编码的,那么你应该考虑重构你的程序,因为它不是Guice项目的结构,特别是wrt.单元测试.我不能多说,因为你没有解释你的程序的确切结构.
| 归档时间: |
|
| 查看次数: |
1012 次 |
| 最近记录: |