Definir propriedade do sistema para o JUnit Runner (Eclipse) para testar um Spring Web App

Nosso aplicativo da Web usa SystemPropertyPlaceholder para carregar arquivos de propriedades, dependendo do valor de uma propriedade do sistema (veja abaixo)

A configuração padrão para executá-lo localmente é armazenada emapplication.properties. No servidor de produção, atualmente apenas definimos "env" para "produção" antes de implantar o aplicativo e ele será carregadoproduction.properties.

Agora, para testar o aplicativo,test.properties arquivo deve ser usado.

Se eu executar todos os testes, diga em nosso build de jenkins, adicionando-Denv=test funcionará como esperado. Mas e se eu quiser apenas executar um único teste no Eclipse com o executor JUnit integrado?

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

Existe alguma maneira de dizer ao meu teste que deve definir a propriedade do sistema "env" para "testar" ANTES de o Spring ser carregado? Porque usandoMethodInvokingFactoryBean só irá configurá-lo depois por algum motivo, mesmo se eu configurá-lo antes de carregar meus arquivos de propriedade:

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

Com as propriedades do banco de dados definidas dentro de application.properties, production.properties e test.properties.

O ponto é, claro, que eu quero usar o mesmo arquivo de contexto para todos os ambientes, caso contrário, eu poderia apenas dizer ao meu teste para usar um contexto diferente onde eu defini a propriedade PropertyPlaceholder "location" para test.properties ... Mas eu quero meus testes também cobrem meu contexto para que quaisquer erros sejam detectados o mais cedo possível (estou fazendo testes de ponta a ponta em nosso aplicativo da web com o spring-web-mvc que carrega todo o aplicativo da web fornecendo um bom feedback lá e Eu não quero perder isso).

Até agora, a única maneira que posso ver é configurar o corredor JUnit para incluir algum argumento de configuração de propriedade do sistema, embora eu não saiba como fazer isso ..

questionAnswers(3)

yourAnswerToTheQuestion