Właśnie zacząłem grać z Guice i przypadkiem użycia, który przychodzi mi do głowy, jest to, że w teście chcę zastąpić pojedyncze wiązanie. Myślę, że chciałbym użyć pozostałych powiązań na poziomie produkcyjnym, aby upewnić się, że wszystko jest poprawnie skonfigurowane i uniknąć duplikacji.
Więc wyobraź sobie, że mam następujący moduł
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);
}
}
W moim teście chcę tylko przesłonić InterfaceC, zachowując jednocześnie InterfaceA i InterfaceB, więc chciałbym coś takiego:
Module testModule = new Module() {
public void configure(Binder binder) {
binder.bind(InterfaceC.class).to(MockC.class);
}
};
Guice.createInjector(new ProductionModule(), testModule);
Próbowałem również następujących rzeczy, bez powodzenia:
Module testModule = new ProductionModule() {
public void configure(Binder binder) {
super.configure(binder);
binder.bind(InterfaceC.class).to(MockC.class);
}
};
Guice.createInjector(testModule);
Czy ktoś wie, czy można robić to, co chcę, czy też całkowicie szczekam na niewłaściwe drzewo?
--- Kontynuacja: wydaje się, że mogę osiągnąć to, co chcę, jeśli użyję tagu @ImplementedBy w interfejsie, a następnie po prostu dostarczę powiązanie w przypadku testowym, co działa dobrze, gdy istnieje mapowanie 1-1 między interfejs i implementacja.
Ponadto po omówieniu tego ze współpracownikiem wydaje się, że wybralibyśmy drogę zastąpienia całego modułu i upewnienia się, że nasze moduły zostały poprawnie zdefiniowane. Wydaje się, że może to jednak powodować problem, gdy powiązanie jest niewłaściwie umieszczone w module i musi zostać przeniesione, co może spowodować zerwanie obciążenia testów, ponieważ powiązania mogą nie być już dostępne do zastąpienia.