Задайте системное свойство для 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 для включения некоторого аргумента настройки системного свойства, хотя я не знаю, как это сделать.

Ответы

Ответ 1

Сейчас я работаю над той же проблемой и, надеюсь, нашел способ. Вы можете вызвать System.setProperty() в статический инициализатор тестового примера.

Ответ 2

В Eclipse щелкните правой кнопкой мыши тестовый класс JUnit, выберите "Запуск от имени" > "Запуск конфигураций...", затем перейдите на вкладку "Аргументы" и в разделе "Аргументы VM" добавьте запись свойства системы, например. -Dcatalina.base = C:\Programs\Apache-7.0.32-кот

Ответ 3

Вы можете попытаться использовать depends-on атрибут для вызова метода bean перед другими