2

在代码审查中,出现了以下评论:“我认为,您实际上是指将工厂作为实例注入,以便您可以在需要时重新绑定工厂。” 和“重要提示:工厂不应该是静态的,而应该是注入的。”

测试.java:

Foo foo = FooFactory.get(argument);

FooFactory.java:

public final class FooFactory {
    public static Foo get(String argument) {
        return new Foo();
    }
}

否则我应该怎么做?审稿人第一条评论中的“rebind”是什么意思?

4

2 回答 2

8

通过做你所做的,你基本上忽略了依赖注入,而是使用了一个静态工厂。因此,如果在单元测试中,您希望您的工厂返回 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 实现(通常是模拟)。

于 2012-05-17T18:33:17.027 回答
3

对于大多数依赖注入框架,您可以在运行时绑定特定的对象实现。我敢打赌,这也是评论者所指的。当然,要利用这一点,您必须注入您的工厂,而不是静态创建它。

于 2012-05-17T18:29:11.467 回答