Установка свойств системы для JUnit Runner (Eclipse) для тестирования веб-приложения Spring

Наше веб-приложение использует SystemPropertyPlaceholder для загрузки файлов свойств в зависимости от значения системного свойства (см. ниже)

Настройка по умолчанию для его локального запуска хранится в application.properties. На рабочем сервере мы просто установили для "env" значение "production" перед развертыванием приложения, и оно загрузит production.properties.

Теперь для тестирования приложения следует использовать файл test.properties.

Если я выполню все тесты, скажем, в нашей сборке jenkins, добавление -Denv=testбудет работать так, как ожидалось. Но что, если я просто хочу запустить один тест в Eclipse со встроенным JUnit бегуном?

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

Есть ли способ сказать моему тесту, что он должен установить системное свойство "env" в "test" ДО загрузки Spring? Потому что использование MethodInvokingFactoryBeanпо какой-то причине установит его только впоследствии, даже если я задам его перед загрузкой файлов свойств:

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

Со свойствами базы данных, определенными внутри application.properties, production.properties и test.properties.

Дело, конечно, в том, что я хочу использовать один и тот же контекстный файл для всех сред, в противном случае я мог бы просто сказать своему тесту использовать другой контекст, где я установил свойство PropertyPlaceholder "location" для test.properties... Но я хочу, чтобы мои тесты также охватывали мой контекст, чтобы любые ошибки там были обнаружены как можно раньше (я делаю сквозные тесты в нашем веб-приложении с spring-web-mvc, которое загружает все веб-приложение, предоставляя там хорошую обратную связь, и я не хочу терять это).

Пока единственный способ, который я вижу, может заключаться в том, чтобы настроить JUnit runner для включения некоторого аргумента настройки системных свойств, хотя я не знаю, как это сделать.

20
задан Pete 12 June 2012 в 12:56
поделиться