ฉันเพิ่งเริ่มเล่นกับ 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 ระหว่าง อินเตอร์เฟสและการใช้งาน
นอกจากนี้หลังจากพูดคุยเรื่องนี้กับเพื่อนร่วมงานดูเหมือนว่าเราจะมุ่งหน้าไปที่ถนนของการเอาชนะโมดูลทั้งหมดและมั่นใจว่าเราได้กำหนดโมดูลของเราอย่างถูกต้อง ดูเหมือนว่าอาจทำให้เกิดปัญหาแม้ว่าการรวมจะถูกวางผิดที่ในโมดูลและจำเป็นต้องย้ายดังนั้นอาจทำลายการทดสอบเนื่องจากภาระอาจไม่สามารถใช้งานได้อีกต่อไป