2011-09-05 17 views
5

私はクラスパス設定でエラーが発生したと思います。JunitテストでWEB-INFの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を持っている国際ウェブアプリをテストしたいです。 ただし、Junit Testを実行すると、クラスパスにないため、これらのプロパティファイルを解決できません。

しかし、私はその後、私はプロパティファイルで何かを変更することができ、それはすぐにウェブサイトに反映されます機能を利用することができますので、それらをクラスパス上にないようにしたい: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のは、同様にそれらの非クラスパスのリソースをピックアップして入手できますか? プロパティファイルは、/src/main/webapp/WEB-INF/i18n/*

Junit:4.7です。

春:3.0.5。

答えて

6

私はその間に私の最初の問題を修正しました。

マシューの解決策は私を助けませんでした - まだ非常に良い入力。 そして、私は決して言わなかったので、私は自分のプロジェクトでmavenを使っていることを知りませんでした。

はしかし、Mavenの中に、私は私の問題への解決策を見つけた:

 <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> 

私はクラスパスのためのピックアップの追加要素に確実な-プラグインを設定しました。

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このため、デフォルト値を設定しますbean定義は、messageSource bean定義の前にある必要があります。 JUnitテストでは、次のいずれかを実行します

  1. は、コマンドラインまたはシステム上の-Doptionを介してシステムのプロパティを設定し、あなたのテストに固有のpropertyConfigurerの異なるバージョンを使用してプロパティを設定する、または
  2. 。あなたののsetProperty( "path.prefix"、 "src/main/webapp")@Beforeです。

(2)を実行すると、システムプロパティの値がキャッシュされることがあるので、その後システムプロパティを変更できないことに注意してください。元の値を使用します。