我刚刚开始使用Guice,我可以想到一个用例就是在测试中我只想覆盖单个绑定。我认为我想使用生产级别的其他绑定来确保所有东西都正确设置并避免重复。
所以,想象一下我有以下模块:
public class ProductionModule implements Module {
public void configure(Binder binder) {
binder.bind(InterfaceA.class).to(ConcreteA.class);
binder.bind(InterfaceB.class).to(ConcreteB.class);
binder.bind(InterfaceC.class).to(ConcreteC.class);
}
}
在我的测试中,我只想覆盖InterfaceC,同时保留InterfaceA和InterfaceB不变,因此我希望有类似以下的内容:
Module testModule = new Module() {
public void configure(Binder binder) {
binder.bind(InterfaceC.class).to(MockC.class);
}
};
Guice.createInjector(new ProductionModule(), testModule);
我也尝试了以下方法,但没有成功:
Module testModule = new ProductionModule() {
public void configure(Binder binder) {
super.configure(binder);
binder.bind(InterfaceC.class).to(MockC.class);
}
};
Guice.createInjector(testModule);
有没有人知道我想要的是否可行,或者我完全走错了方向?
--- 进一步地: 如果我在接口上使用@ImplementedBy标记,然后在测试案例中提供一个绑定,似乎可以实现我想要的效果。当接口和实现之间存在1-1映射关系时,这种方法非常有效。
此外,经与同事讨论后,我们似乎将走向覆盖整个模块并确保我们正确定义了自己的模块的路线。不过这似乎可能会导致问题,例如绑定错误放置在模块中并需要移动,从而可能会破坏大量测试,因为绑定可能无法再被覆盖。