java - Establecer propiedades del sistema para JUnit Runner(Eclipse) para probar una aplicación web de Spring
system-properties (3)
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 de VM, agregue en la entrada de propiedad del sistema, por ejemplo, -Dcatalina.base = C: / programs / apache-tomcat-7.0.32
Nuestra aplicación web utiliza SystemPropertyPlaceholder para cargar archivos de propiedades en función del valor de una propiedad del sistema (ver más abajo)
La configuración predeterminada para ejecutarlo localmente se almacena en application.properties
. En el servidor de producción, actualmente solo configuramos "env" en "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 -Denv=test
en nuestra compilación jenkins, agregar -Denv=test
funcionará como se esperaba. ¿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 decirle a mi prueba que debe establecer la propiedad del sistema "env" en "prueba" ANTES de que Spring esté cargada? Porque el uso de MethodInvokingFactoryBean
solo lo establecerá después por algún motivo, incluso si lo configuro 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 la base de datos definidas dentro de 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 decirle a mi prueba que use un contexto diferente donde establezco la "ubicación" de la propiedad PropertyPlaceholder en test.properties ... Pero quiero mis pruebas también cubren mi contexto para que cualquier error se detecte 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 y proporciona algunos comentarios agradables allí y No quiero perder eso.
Hasta ahora, la única forma que puedo ver es configurar el corredor JUnit para incluir algún argumento de configuración de propiedades del sistema, aunque no sé cómo hacerlo.
Estoy trabajando exactamente en el mismo problema y espero encontrar el camino. Puede llamar a System.setProperty()
al inicializador estático de su caso de prueba.
Podría intentar usar depends-on
atributo depends-on
para que el método que invoca a bean se ejecute antes que otros