在代码审查中,出现了以下评论:“我认为,您实际上是指将工厂注入实例,以便您可以在需要时重新启动工厂。”并且“重要提示:工厂不应该是静态的,而应该注入。”
Test.java:
Foo foo = FooFactory.get(argument);
FooFactory.java:
public final class FooFactory {
public static Foo get(String argument) {
return new Foo();
}
}
我应该怎么做呢? “重新绑定”在评论者的第一条评论中意味着什么?
答案 0 :(得分:6)
通过执行您所做的操作,您基本上忽略了依赖注入,并使用了静态工厂。因此,如果在单元测试中,您希望工厂返回虚假的Foo实例而不是真实实例,则不能。
相反,您应该使用依赖注入(这里是Spring示例):
public class SomeService
private FooFactory fooFactory;
@Autowired
public SomeService(FooFactory fooFactory) {
this.fooFactory = fooFactory;
}
public void someMethod(String arg) {
Foo foo = fooFactory.create(arg);
...
}
....
}
现在,在单元测试中,您可以注入所需的任何FooFactory实现(通常是模拟)。
答案 1 :(得分:3)
对于大多数依赖注入框架,您可以在运行时绑定特定的对象实现。我打赌这也是评论家所指的。当然,要利用这一点,你必须注入你的工厂,而不是静态创建它。