2011-09-05 8 views
5

में वेब-आईएनएफ से i18n संसाधनों का उपयोग करना मुझे लगता है कि मैं अपनी कक्षापथ सेटिंग्स के साथ एक त्रुटि में भाग गया।जूनिट परीक्षण

<bean id="messageSource" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>/WEB-INF/i18n/errors</value> 
      <value>/WEB-INF/i18n/messages</value> 
      <value>/WEB-INF/i18n/links</value> 
      <value>/WEB-INF/i18n/forms</value> 
      <value>/WEB-INF/i18n/communication</value> 
     </list> 
    </property> 
</bean> 

इन मूल्यों लोड हो रहा है उत्पादन परिवेश में पूरी तरह से काम करता है:

मैं एक अंतर्राष्ट्रीय वेब-एप्लीकेशन जो messagesource इस तरह परिभाषित किया गया है परीक्षण करना चाहते हैं। हालांकि जूनिट टेस्ट चलाते समय, यह उन संपत्ति फ़ाइलों को हल नहीं कर सकता क्योंकि वे क्लासपाथ पर नहीं हैं।

हालांकि, मैं क्योंकि तब मैं सुविधा का उपयोग कर सकते है जहाँ मैं संपत्ति फाइलों में कुछ बदल सकते हैं उन्हें classpath पर नहीं होना चाहते हैं और यह वेबसाइट तुरंत पर परिलक्षित है: Since application servers typically cache all files loaded from the classpath, it is necessary to store resources somewhere else (for example, in the "WEB-INF" directory of a web app). Otherwise changes of files in the classpath will not be reflected in the application.

वसंत applicationContext है वहाँ स्थित: /src/main/resources/spring/applicationContext.xml और JUnit परीक्षण में लोड इन एनोटेशन के साथ:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:/spring/applicationContext.xml"}) 

मैं JUnit कैसे प्राप्त रूप में अच्छी तरह से उन गैर classpath संसाधनों को लेने के लिए कर सकते हैं? संपत्ति फाइलें /src/main/webapp/WEB-INF/i18n/*

जूनिट: 4.7 पर हैं।

वसंत: 3.0.5।

उत्तर

6

इस दौरान मैंने अपनी प्रारंभिक समस्या तय की।

मैथ्यू के समाधान ने मेरी मदद नहीं की - अभी भी बहुत अच्छा इनपुट। और वह नहीं जानता था कि मैं अपने प्रोजेक्ट में मैवेन का उपयोग कर रहा था क्योंकि मैंने कभी नहीं बताया था।

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
       <skipTests>true</skipTests> 
       <additionalClasspathElements> 
        <additionalClasspathElement>src\main\webapp\</additionalClasspathElement> 
       </additionalClasspathElements> 
      </configuration> 
     </plugin> 

मैं classpath के लिए पिक अतिरिक्त तत्वों को अचूक-प्लगइन कॉन्फ़िगर किया गया:

हालांकि, Maven के भीतर, मैं अपनी समस्या का समाधान मिल गया।

3

यह मेरे लिए आसान समाधान लगता है सिर्फ एक संपत्ति है जो आप को ओवरराइड जब JUnit निष्पादित हो रहा है का उपयोग करें:

<bean id="messageSource" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>${path.prefix}/WEB-INF/i18n/errors</value> 
      <value>${path.prefix}/WEB-INF/i18n/messages</value> 
      <value>${path.prefix}/WEB-INF/i18n/links</value> 
      <value>${path.prefix}/WEB-INF/i18n/forms</value> 
      <value>${path.prefix}/WEB-INF/i18n/communication</value> 
     </list> 
    </property> 
</bean> 

आप PropertyPlaceholderConfigurer

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
    <property name="properties"> 
     <props> 
      <prop key="path.prefix"></prop> <!-- empty --> 
     </props> 
    </property> 
</bean> 

यह propertyConfigurer में इस के लिए डिफ़ॉल्ट मान सेट बीन परिभाषा संदेश स्रोत बीन परिभाषा से पहले होना चाहिए। JUnit परीक्षण में, आप कर सकते हैं:

  1. अपने परीक्षण, या
  2. कमांड लाइन या सिस्टम पर एक -Doption के माध्यम से प्रणाली संपत्ति की स्थापना करने के लिए propertyConfigurer विशिष्ट का एक अलग संस्करण का उपयोग कर के माध्यम से संपत्ति की स्थापना की। @ में सेटप्रॉपर्टी ("path.prefix", "src/main/webapp")।

ध्यान दें कि यदि आप (2) करते हैं, तो वसंत कभी-कभी सिस्टम गुणों के मूल्यों को कैश करता है, इसलिए आप सिस्टम प्रॉपर्टी को बाद में बदल नहीं सकते हैं। यह मूल मूल्य का उपयोग करता है।

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