2011-09-05 13 views
5

Creo que encontré un error con la configuración de mi classpath.Utilizando recursos i18n de WEB-INF en la prueba Junit

Quiero probar una aplicación Web internacionalizado que tiene la MessageSource define así:

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

Cargando estos valores funciona perfectamente en un entorno de producción. Sin embargo, al ejecutar una prueba de Junit, no puede resolver esos archivos de propiedad porque no están en la ruta de clases.

Sin embargo, yo quiero que sean NO en la ruta de clase porque entonces puedo hacer uso de la función de donde puedo cambiar algo en los archivos de propiedades y que se refleja en el sitio web de inmediato: 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.

El resorte applicationContext es se encuentra allí: /src/main/resources/spring/applicationContext.xml y se carga en la prueba Junit con estas anotaciones:

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

¿Cómo puedo obtener Junit para recoger esos recursos no classpath así? Los archivos de propiedades están en /src/main/webapp/WEB-INF/i18n/*

Junit: 4.7.

Spring: 3.0.5.

Respuesta

6

me fijo mi problema inicial en el ínterin.

solución de Mateo no me ayudó - sigue siendo muy buena entrada. Y no podía saber que estaba usando maven en mi proyecto ya que nunca lo dije.

Sin embargo, dentro experta, he encontrado una solución a mi problema:

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

que configuran el éxito seguro-plugin para la recolección de elementos adicionales para la ruta de clases.

3

Me parece la solución más simple es utilizar una propiedad que se anula cuando JUnit está ejecutando:

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

Establece el valor por defecto de este en el 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> 

Este propertyConfigurer la definición de bean debe estar antes de la definición de bean messageSource. En las pruebas junit, puede:

  1. establezca la propiedad mediante el uso de una versión diferente de la propertyConfigurer específico para sus pruebas, o
  2. estableciendo la propiedad a través de un sistema de -Doption en la línea de comandos o del sistema. setProperty ("path.prefix", "src/main/webapp") en su @Antes de.

Tenga en cuenta que si lo hace (2), Spring a veces guarda en caché los valores de las propiedades del sistema, por lo que no puede modificar posteriormente la propiedad del sistema. Utiliza el valor original.