最佳答案
我刚开始使用 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映射时,绑定就可以很好地工作。
另外,在与同事讨论过这个问题之后,我们似乎要重写整个模块并确保正确定义模块。这似乎会导致一个问题,虽然绑定在模块中放错了位置,需要移动,因此可能会破坏测试负载,因为绑定可能不再可用以被覆盖。