下面是我们如何在新应用程序中使用guice:
public class ObjectFactory {
private static final ObjectFactory instance = new ObjectFactory();
private final Injector injector;
private ObjectFactory() throws RuntimeException {
this.injector = Guice.createInjector(new Module1());
}
public static final ObjectFactory getInstance() {
return instance;
}
public TaskExecutor getTaskExecutor() {
return injector.getInstance(TaskExecutor.class);
}
}
``` `Module1` 定义 `TaskExecutor` 需要建造。
在我们使用的代码中 `ObjectFactory.getInstance().getTaskExecutor()` 获得 `TaskExecutor` .
在单元测试中,我们希望能够用 `FakeTaskExecutor` 本质上我们想得到一个 `FakeTaskExecutor` 什么时候 `ObjectFactory.getInstance().getTaskExecutor()` 被称为。
我在考虑实施一个 `FakeModule` 将由喷油器使用,而不是 `Module1` .
在Spring,我们只会使用 `@Autowired` 注解,然后为 `Test` 以及 `Production` 使用 `Spring4JunitRunner` ; 我们正试图对guice做类似的事情。
1条答案
按热度按时间xa9qqrwz1#
好吧,首先:你似乎没有按预期的方式使用guice。一般来说,你想用
Guice.createInjector()
启动整个应用程序,让它为您创建所有构造函数参数,而无需调用new
.典型的用例可能是这样的:
这是因为foo的示例本身是注入的,一直到对象图。请参阅:入门
通过依赖项注入,对象接受其构造函数中的依赖项。要构造一个对象,首先要构建它的依赖关系。但要构建每个依赖项,需要它的依赖项,以此类推。所以当你构建一个对象时,你真的需要构建一个对象图。
手工构建对象图是劳动密集型的,容易出错,并且使测试变得困难。相反,guice可以为您构建对象图。但是首先,guice需要被配置成完全按照您的需要构建图形。
因此,通常情况下,您不会创建一个单例模式并将注入器放入其中,因为您不应该调用
Guice.createInstance
在你的主要班级之外;让注射器为你做所有的工作。尽管如此,要解决你真正想问的问题,你需要使用jukito。
junit、guice和mockito的联合力量。而且这听起来像是一种很酷的武术。
让我们回到我上面描述的用例。在朱基托,你会写
FooTest
这样地:这将验证mockito通过jukito生成的mock对象是否具有该方法
someMethod
用绳子打了两次电话"Hello World"
两次都是。这就是为什么您不希望使用
ObjectFactory
以你描述的方式;jukito在单元测试中为您创建了一个注入器,而注入一个mock将非常困难,您必须编写大量的样板文件。