我有一个maven项目javaruntime
和一个maven项目androidruntime
,它依赖于javaruntime
项目。每个项目都有一个Guice模块,将一些类绑定到接口。
在javaruntime中,是一个接口IElementFactory和一个类,该类通过构造函数注入获得IElementFactory:
public class C {
@Inject
public C(IElementFactory factory, ...(other interfaces)...) {...}
// ...
}
IElementFactory的具体实现在androidruntime项目中,称为AndroidElementFactory。其他接口的所有实现都在javaruntime中。
在javaruntime中,我有JUnit测试,它应该使用MockElementFactory,因为它不知道androidruntime。
如果我仅在androidruntime模块中将IElementFactrory
绑定到AndroidElementFactory
,测试当然会失败,因为在javaruntime
模块/项目中没有为该接口绑定任何实现。
如果我随后在javaruntime模块中绑定了MockElementFactory,测试就可以了,但是我无法编译androidruntime,因为IElementFactory已经绑定到MockElementFactory,覆盖绑定是错误的,并且在Guice中不会重新推荐。
但是我如何才能实现Mock用于测试,并且在android项目中仍然可以绑定正确的实现?
首先,事实上你不想这么做。当您对类进行单元测试时,尤其是使用mock时,您不应该使用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
...
}
}
并且在您的MockModule
和AndroidModule
中绑定了IElementFactory
的相应实现。
然后在您的测试中,您可以像这样创建注射器:
Injector injector = Guice.createInjector(new MainModule(), new MockModule());
在android项目中,您可以这样创建它:
Injector injector = Guice.createInjector(new MainModule(), new AndroidModule());
如果您无法做到这一点,因为注入器实例化是硬编码的,那么您应该真正考虑重构您的程序,因为它不是Guice项目的结构,尤其是wrt。单元测试。我不能再多说了,因为你们还并没有解释你们程序的确切结构。
我正在开发一个Play(2.4版)应用程序,Guice是DI提供商。一切运行正常,但是我有一组使用ScalaTestPlus运行的功能测试,我想在测试运行时替换一些依赖项。这些测试是通过扩展类来编写的,因为它们检查我的REST API。 在测试过程中是否有其他依赖关系? 编辑:示例代码: 样品控制器: 和模块中的依赖定义: 我的测试是这样的: 我希望用其他实现取代,但只在测试中使用。
我是一个尝试使用Guice的人(这里是新手!!)我的一个项目。 所以我有一个 我的实现是 我还将DataQueue接口定义为 DataQueue的实现如下 在我的AppModule.Configure方法中,我有以下代码 我的ConsumerFactory是一个带有create()方法的接口,该方法返回一个使用者 我的DataQueueFactory是一个带有create()方法的接口,该方法返回
问题内容: 我是否需要创建一个将接口绑定到其他实现的新模块? 我无法触摸厨师课堂或界面。我只是在运行时将Chef的FortuneService绑定到不同接口的客户端。 问题答案: 外观类似于Guice常见问题解答中的“ 机器人腿”部分。“如何创建一个带有两个Leg对象的机器人,左边的一个对象注入一个LeftFoot,右边的一个注入RightFoot。” 但是只有一个在两个上下文中都可以重用的Leg
问题内容: 我想在Go中创建一个带有测试和示例的包作为子目录,以保持工作区的整洁。这有可能吗? 所有文档总是将测试代码与其他代码放在同一位置,这在某种程度上还是惯例上更好? 问题答案: 请注意,您 可以 “递归” 运行:您需要 列出要测试的所有软件包 。 如果您位于Go项目的根文件夹中,请键入: “ ”符号在“ 命令 ” 的“ 软件包列表说明 ” 部分中进行了描述: 如果导入路径包含一个或多个通配
我正在使用Google Guice编写一个组件,它位于一个不使用任何依赖注入工具的web应用程序旁边。 组件中的Guice模块有几个不会改变的“固定”绑定和几个动态绑定,因为它们在web应用程序的每个请求中都会改变。 我解决这个问题的最简单(也是最糟糕)的方法是,每当web应用程序第一次要求组件做某事时,组件就会构建新的Guice模块,创建实例并将其返回给web应用程序: 我认为这是一种糟糕的方法