2012-06-12 11 views
16

Nuestra aplicación web utiliza SystemPropertyPlaceholder para cargar archivos de propiedades, dependiendo del valor de una propiedad del sistema (véase más adelante)conjunto de propiedades del sistema para JUnit Runner (Eclipse) para probar un Spring Web App

La configuración por defecto para ejecutar de forma local se almacena en application.properties. En el servidor de producción actualmente solo configuramos "env" para "producción" antes de implementar la aplicación y cargará production.properties.

Ahora para probar la aplicación, se debe usar un archivo test.properties.

Si ejecuto todas las pruebas, digo en nuestra compilación de jenkins, agregando -Denv=test funcionará como se espera. Pero, ¿qué sucede si solo quiero ejecutar una única prueba en Eclipse con el corredor JUnit integrado?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = WebContextLoader.class, locations = {"classpath:application-context.xml" }) 
public class SomeTest { 

¿Hay alguna manera de saber mi prueba debe establecer la propiedad del sistema "env" a "prueba" antes de la primavera está cargado? Dado que el uso MethodInvokingFactoryBean sólo establecerá que después, por alguna razón, incluso si lo fijo antes de cargar mis archivos de propiedades:

<bean id="systemPrereqs" 
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" value="#{@systemProperties}" /> 
    <property name="targetMethod" value="putAll" /> 
    <property name="arguments"> 
     <!-- The new Properties --> 
     <util:properties> 
      <prop key="env">test</prop> 
     </util:properties> 
    </property> 
</bean> 

<bean 
    class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
    <property name="searchContextAttributes" value="true" /> 
    <property name="contextOverride" value="true" /> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="locations"> 
     <list> 
      <value>classpath:application.properties</value> 
      <value>classpath:${env}.properties</value> 
      <value>${config}</value> 
     </list> 
    </property> 
</bean> 

<bean id="managerDataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="username"> 
     <value>${database.username}</value> 
    </property> 
    <property name="password"> 
     <value>${database.password}</value> 
    </property> 
    <property name="url"> 
     <value>${database.url}</value> 
    </property> 

</bean> 

Con las propiedades de base de datos definidos en el interior Application.properties, production.properties y test.properties.

El punto es, por supuesto, que quiero usar el mismo archivo de contexto para todos los entornos, de lo contrario podría decir que use un contexto diferente donde establecí la propiedad "Ubicación" de PropertyPlaceholder en test.properties. .Pero quiero que mis pruebas también cubran mi contexto para que los errores que haya se detecten lo antes posible (estoy haciendo pruebas de extremo a extremo en nuestra aplicación web con spring-web-mvc, que carga toda la aplicación web proporcionando algunos buen comentario allí y no quiero perder eso).

Hasta ahora, la única manera que puedo ver que podría ser para configurar el corredor JUnit incluir algún argumento establecer la propiedad del sistema, aunque no sé cómo hacer eso ..

+0

yo diría perfiles de uso en aquellos perfiles importar el correcto archivos que necesitas Parece que estás reinventando la rueda. Con el perfil, simplemente puede agregar '@ ActiveProfiles' a su caso de prueba para que se carguen las cosas correctas. En cambio od '-Denv = test', entonces usted usaría' -Dspring.active.profiles = test' –

Respuesta

33

estoy trabajando en exactamente el mismo problema ahora y espero encontrar el camino. Puede llamar al System.setProperty() en el inicializador estático de su caso de prueba.

+0

Cool, funciona! ¡Gracias! :) – Pete

+1

Si bien esto funcionará cuando se ejecuta una prueba individual, puede no funcionar necesariamente cuando se ejecutan varias pruebas, ya que el contexto Spring se puede reutilizar en varias pruebas. – pimlottc

+0

@pimlottc, en mi humilde opinión ejecutar múltiples pruebas no causa ningún problema en este caso. El problema es que tenemos que establecer la propiedad del sistema antes de la inicialización del contexto de primavera. Esto se logra usando el inicializador estático. Si todos los casos de prueba que comparten el mismo contexto de primavera establecen esta propiedad (ese es el caso), el contexto de primavera se inicializará correctamente. – AlexR

16

En Eclipse, haga clic con el botón derecho en la clase de prueba JUnit, seleccione Ejecutar como> Ejecutar configuraciones ..., luego vaya a la pestaña Argumentos y en Argumentos VM, agregue la entrada de propiedad del sistema, p. -Dcatalina.base = C: \ Programas \ apache-tomcat-7.0.32

+3

¿Hay alguna manera de hacer esto para todas las pruebas de forma predeterminada, por lo que no tiene que establecer manualmente esta propiedad para cada prueba? – Stewart

0

Usted podría tratar de usar depends-on atributo tener método de invocación de frijol de ejecución antes de que otros

Cuestiones relacionadas