Acabei de começar a brincar com o Guice, e um caso de uso em que consigo pensar é que, em um teste, quero substituir uma única ligação. Eu acho que gostaria de usar o restante das ligações de nível de produção para garantir que tudo esteja configurado corretamente e para evitar duplicação.
Então imagine que eu tenho o seguinte módulo
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);
}
}
E no meu teste, eu quero apenas substituir a InterfaceC, mantendo a InterfaceA e a InterfaceB intactas, então gostaria de algo como:
Module testModule = new Module() {
public void configure(Binder binder) {
binder.bind(InterfaceC.class).to(MockC.class);
}
};
Guice.createInjector(new ProductionModule(), testModule);
Eu também tentei o seguinte, sem sorte:
Module testModule = new ProductionModule() {
public void configure(Binder binder) {
super.configure(binder);
binder.bind(InterfaceC.class).to(MockC.class);
}
};
Guice.createInjector(testModule);
Alguém sabe se é possível fazer o que eu quero ou estou latindo completamente na árvore errada?
--- Acompanhamento: parece que posso conseguir o que quero se fizer uso da tag @ImplementedBy na interface e fornecer apenas uma ligação no caso de teste, o que funciona bem quando há um mapeamento 1-1 entre a interface e implementação.
Além disso, depois de discutir isso com um colega, parece que seguiríamos no caminho de substituir um módulo inteiro e garantir que nossos módulos estejam definidos corretamente. Parece que isso pode causar um problema, embora uma ligação seja extraviada em um módulo e precise ser movida, possivelmente interrompendo uma carga de testes, pois as ligações podem não estar mais disponíveis para serem substituídas.