2010-05-24 12 views
8

मैं एक यूनिट परीक्षण चलाने के लिए चाहता हूं जहां स्थिर संस्करण मानक से थोड़ा अलग है। कि बाकी के सभी कॉपी किए बिनाguice में मॉड्यूल के पदानुक्रम

bindConstant().annotatedWith(Names.named("number of players")).to(2); 

आईडी प्राप्त करने के लिए की तरह है: यही कारण है, मेरा डिफ़ॉल्ट मॉड्यूल में, निम्नलिखित

bindConstant().annotatedWith(Names.named("number of players")).to(4); 

लेकिन परीक्षण में, मैं बजाय इस लाइन की कोशिश करना चाहते हैं मॉड्यूल के। जो मैं वास्तव में चाहता हूं वह एक "डिफ़ॉल्ट" मॉड्यूल है जो एक अधिक विशिष्ट मॉड्यूल "नीचे" है, जैसे कि संघर्ष के मामले में, विशेष मॉड्यूल जीतता है (एक अपवाद फेंकने के बजाय, जो गुइस करता है)।

संक्षेप में, मेरा प्रश्न है: कोई भी कोड कोड डुप्लिकेशंस के बिना एक से अधिक मॉड्यूल की व्यवस्था कैसे करता है?

अद्यतन: मुझे एहसास हुआ है कि समाधान वास्तव में इस उपयोग के मामले में निरंतर एक कारखाने का उपयोग करना है। हालांकि, मुझे सामान्य रूप से मॉड्यूल के पदानुक्रमों की तरह कुछ सीखने में दिलचस्पी होगी।

उत्तर

10

आमतौर पर जब गुइस का सही उपयोग करते हैं, तो आपको सभी परीक्षणों में विशेष रूप से यूनिट परीक्षण (एकीकरण और अंत तक परीक्षण, हां) का उपयोग करने की आवश्यकता नहीं है। वैसे भी:

मुझे यकीन नहीं है कि मैं समझ रहा हूं कि आप क्या करने की कोशिश कर रहे हैं या समस्या वास्तव में क्या है ... आप महसूस करते हैं कि Injector बनाते समय आप Module एस को किसी भी संख्या प्रदान कर सकते हैं, है ना? यह गुइस का उपयोग करने का एक महत्वपूर्ण हिस्सा है। मॉड्यूल को पाठ्यक्रम के रूप में या ठीक से तैयार करें जैसा आप चाहते हैं। आपके पास NumberOfPlayersModule हो सकता है जिसमें केवल एक बाध्यकारी हो, और उसके बाद कभी-कभी एक अलग मॉड्यूल का उपयोग अलग-अलग बाध्यकारी के साथ करें (जैसे आपके परीक्षण के लिए)। आप एक मॉड्यूल भी बना सकते हैं जो एक कन्स्ट्रक्टर तर्क लेता है और मॉड्यूल को new NumberOfPlayersModule(4) या new NumberOfPlayersModule(2) जैसा चाहें उतना बना सकता है।

गुइस की एक और विशेषता भी है जो आपको एक या एक से अधिक मॉड्यूल से बाइंडिंग के साथ एक या अधिक मॉड्यूल में बाइंडिंग ओवरराइड करने देती है। यही कारण है कि इस तरह से काम करता है:

// FooModule is your module that contains the "number of players" binding and 
// some others 

Module override = Modules.override(new FooModule()) 
    .with(new AbstractModule() { 
     protected void configure() { 
     bindConstant().annotatedWith(Names.named("number of players")).to(2); 
     } 
    }); 
Injector injector = Guice.createInjector(override); 
// The int @Named("number of players") for the injector is 2 

आप देख सकते हैं, वहाँ वास्तव में काफी तरीके आसानी से अपने आवेदन अलग अलग तरीकों को विन्यस्त करने के लिए की एक बहुत कुछ कर रहे हैं।

+0

ओवरराइड! यही वही है जो मैं चाहता था! धन्यवाद! – nes1983

संबंधित मुद्दे