2011-06-17 14 views
5

में मॉकिटो के साथ एक प्रॉपर्टी फ़ाइल मॉकिंग मैं अपने नियंत्रक में निम्न विधि के लिए यूनिट परीक्षण लिखने की कोशिश कर रहा हूं।स्प्रिंग

@Autowired 
    private ApplicationContext context; 

    private String getProperty() { 
     try { 
      Properties props = context.getBean("myProperties", Properties.class); 
      String val = props.getProperty("myProperty"); 
...... 

बीन मेरी applicationContext में इस तरह घोषित किया जाता है:

<util:properties id="myProperties" scope="prototype" location="file:${catalina.base}/webapps/myProperties.properties"/> 

मैं यह कैसे नकली करूँ ताकि वैल चर के विभिन्न मानों परीक्षण कर सकते हैं?

context = Mockito.mock(ApplicationContext.class); 
Mocikto.when(context.getBean("myProperties", Properties.class)).thenReturn(some test file) 

लेकिन फिर मैं कहीं परीक्षण फ़ाइल एक सेम के रूप में घोषित करने के लिए होगा:

मैं एक परीक्षण गुण फ़ाइल बनाने और इस तरह यह मजाक के बारे में सोचा।

मैं सोच रहा था कि ऐसा करने का कोई आसान तरीका है या नहीं?

धन्यवाद

+1

क्या आप स्प्रिंग एमवीसी का उपयोग कर रहे हैं? अपने नियंत्रक को एप्लिकेशन कॉन्टेक्स्ट का संदर्भ देने और इसके मूल्यों को खींचने के बजाय, आप बस अपने कंट्रोलर पर एक फ़ील्ड परिभाषित कर सकते हैं और नियंत्रक की बीन परिभाषा में इसके लिए एक मान निर्धारित कर सकते हैं। फिर परीक्षण एक गैर-मुद्दा बन जाता है, क्योंकि आप अपने नियंत्रक को प्रारंभ कर सकते हैं, हालांकि आप अपने परीक्षणों में चाहते हैं - एप्लिकेशन संदर्भ को नकल करने की आवश्यकता नहीं है। –

उत्तर

5

आप वसंत -3 का उपयोग कर रहे हैं, तो आप कर सकते हैं:

<context:property-placeholder location="myprops.properties" /> 

और अपने कोड में:

@Value("${myProperty}") 
private String myProp; 

public String getMyProp() { 
    return myProp; 
} 

इस कारण myprops.properties $ {...} भाव के माध्यम से चर प्रतिस्थापन के लिए उपलब्ध कराया जा सकता है, और @value एनोटेशन prope के मूल्य इंजेक्शन की अनुमति देता है rties। फिर अपने यूनिट परीक्षण में आप बस मेरेप्रॉप के विभिन्न मान सेट कर सकते हैं।

+0

यह एक प्रश्न में संबंध है जो मैंने पहले पूछा था ... क्या होगा यदि myprops.proeprties नहीं मिल पा रहे हैं? वर्तमान में मेरे पास इसे पकड़ने की कोशिश में है क्योंकि यह गुण फ़ाइल युद्ध के बाहर रहता है और थोड़ी सी संभावना है कि यह सही स्थान पर नहीं होगा – blong824

+0

वसंत कंटेनर फेंक देगा। मुझे लगता है कि यदि गुण नहीं मिलते हैं तो आप कुछ डिफ़ॉल्ट लागू करने का प्रयास कर सकते हैं, लेकिन मैं कंटेनर शुरू नहीं करना पसंद करता हूं। यदि प्रॉपर्टी फ़ाइल गुम है या गलत स्थान या कुछ में है, तो क्या आप बस कुछ हद तक सही गुणों पर चुपचाप वापस आने के बजाए तुरंत पता नहीं लगाएंगे और इसे ठीक करेंगे? – Kevin

1

आसान तरीका बजाय वसंत आवेदन संदर्भ से स्पष्ट रूप से गुण खींच के एक org.springframework.beans.factory.config.PropertyPlaceholderConfigurer उपयोग करने के लिए है। PropertyPlaceholderConfigurer आपके द्वारा निर्दिष्ट गुणों के साथ आपके बीन इंजेक्ट करता है। फिर आपको मॉकिटो की बिल्कुल आवश्यकता नहीं है, परीक्षण में आपने कंट्रोलर में संपत्ति मूल्य सेट किया है जो भी आप चाहते हैं।

<context:property-placeholder 
    location="file:${catalina.base}/webapps/myProperties.properties"/> 

और अपने नियंत्रक के लिए कुछ विन्यास को जोड़ने (मैं वहाँ एनोटेशन के साथ यह करने के लिए एक रास्ता है उम्मीद है, लेकिन यह पता नहीं है):

तो तुम ऊपर configurer आवेदन संदर्भ एक्सएमएल में सेट करते हैं :

<bean id="whateverMyControllerIdIs" class="com.initech.foobar.MyControllerImpl"> 
    <property name="quux"><value>${myProperty}</value></property> 
</bean> 

जहां नियंत्रक एक उदाहरण चर है कि आप संपत्ति के साथ पॉप्युलेट करने के लिए करना चाहते हैं, एक सेटर के साथ, इस तरह:

String quux; 

public void setQuux(String quux) {this.quux = quux;} 

बस a blog post on Spring 3.1 enhancements देखा था, यहाँ नया एक्सएमएल से मुक्त यह करने के लिए तरीका है:

@Configuration 
@PropertySource("classpath:/com/myco/app.properties") 
public class AppConfig { 
    @Autowired 
    Environment env; 

    @Bean 
    public TestBean testBean() { 
     TestBean testBean = new TestBean(); 
     testBean.setName(env.getProperty("testbean.name")); 
     return testBean; 
    } 
} 
+0

प्रतिक्रिया के लिए धन्यवाद। क्या आप मुझे दिखा सकते हैं कि उपरोक्त मेरे उदाहरण का उपयोग करने वाला कोड कैसा दिखाई देगा? – blong824

1

तो मैं स्प्रिंग कॉन्टेक्स्ट लोड किए बिना परीक्षण कर सकता हूं, मैं कोड के भीतर से सभी गुण फ़ाइल (मानों) मानों तक पहुंचने के लिए कॉन्फ़िगर क्लास का उपयोग करता हूं। लाभ हैं:

1) वसंत अपनी यूनिट में लोड नहीं होता

2 का परीक्षण करती है) यदि संपत्ति याद आ रही है आप एक अपवाद मजबूर कर सकते हैं और यह

3 आवश्यक है) आप दृढ़ता से लौट टाइप कर सकते हैं गेटटर() विधियों से संपत्ति मूल्य (यानी(यानी जनता स्थिर अंतिम PROP_XXX एक तिथि)

4) अपने गुण फ़ाइलों से उम्मीद "कुंजी" मूल्यों एक भी जावा वर्ग में दर्ज कर रहे हैं करने के लिए कनवर्ट)

@Component 
public class Config { 

public static final String PROP_USER_NAME = "user.name"; 

private Properties applicationProperties; 


/*** Functional methods ***/ 

/** 
* Helper method to ensure consistent Exception handling where requested property values are missing 
* from the properties files and they are "required" for the application to function correctly. 
* 
* @param key 
* @return The String value of the property requested 
*/ 
private String readPropertyRequired(String key) { 

    String value = readProperty(key); 

    if(StringUtils.isBlank(value)) { 
     throw new PropertyNotFoundException(key); 
    } 

    return value; 
} 

/** 
* Helper method to return String values from the properties files that have been loaded 
* 
* @param key 
* @return The String value of the property requested or NULL if empty 
*/ 
private String readProperty(String key) { 
    return applicationProperties.getProperty(key); 
} 


/*** Getters & Setters ***/ 

@Autowired 
public void setApplicationProperties(Properties applicationProperties) { 
    this.applicationProperties = applicationProperties; 
} 

public String getUserName() { 
    return readPropertyRequired(PROP_USER_NAME); 
} 

}

तब आप इकाई मानक java.util.Properties को इंजेक्ट करके इस वर्ग का परीक्षण करें