好的,首先要做的事情是:您似乎没有按照预期的方式使用 Guice。一般来说,你想使用Guice.createInjector()
启动整个应用程序,并让它为您创建所有构造函数参数,而无需调用new
.
典型的用例可能是这样的:
public class Foo {
private final TaskExecutor executor;
@Inject
public Foo(TaskExecutor executor) {
this.executor = executor;
}
}
这是有效的,因为 Foo 的实例是自己注射,一直到对象图。看:入门
通过依赖项注入,对象在其构造函数中接受依赖项。要构造一个对象,首先要构建它的依赖项。但要构建每个依赖项,您需要其依赖项,依此类推。所以当你构建一个对象时,你确实需要构建一个对象图。
手动构建对象图是劳动密集型的,容易出错,并且使测试变得困难。相反,Guice 可以为您构建对象图。但首先,需要配置 Guice 以完全按照您想要的方式构建图表。
因此,通常,您不会创建单例模式并将注入器放入其中,因为您应该很少调用Guice.createInstance
在你的主课程之外;让注射器为您完成所有工作。
话虽这么说,为了解决您实际询问的问题,您想要使用Jukito.
JUnit、Guice 和 Mockito 的综合威力。而且这听起来像是一门很酷的武术。
让我们回到上面描述的用例。在 Jukito 中,你会写FooTest
像这样:
@RunWith(JukitoRunner.class)
public class FooTest {
public static class Module extends JukitoModule {
@Override
protected void configureTest() {
bindMock(TaskExecutor.class).in(TestSingleton.class);
}
}
@Test
public void testSomething(Foo foo, TaskExecutor executor) {
foo.doSomething();
verify(executor, times(2)).someMethod(eq("Hello World"));
}
}
这将验证您的模拟对象,由生成Mockitovia Jukito 有这个方法someMethod
用字符串调用它两次"Hello World"
两次。
这就是为什么你不想用生成对象ObjectFactory
以你描述的方式; Jukito 在其单元测试中为您创建了 Injector,而注入 Mock 会非常困难,而且您必须编写大量样板文件。