it-swarm.com.ru

Установите системное свойство для JUnit Runner (Eclipse) для тестирования Spring Web App

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

19
Pete

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

39
AlexR

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

19
bratan

Вы можете попытаться использовать атрибут depends-on , чтобы метод, вызывающий компонент, выполнялся раньше других. 

0
bmichalik