Ответ 1
Сейчас я работаю над той же проблемой и, надеюсь, нашел способ. Вы можете вызвать System.setProperty()
в статический инициализатор тестового примера.
В нашем веб-приложении 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 для включения некоторого аргумента настройки системного свойства, хотя я не знаю, как это сделать.
Сейчас я работаю над той же проблемой и, надеюсь, нашел способ. Вы можете вызвать System.setProperty()
в статический инициализатор тестового примера.
В Eclipse щелкните правой кнопкой мыши тестовый класс JUnit, выберите "Запуск от имени" > "Запуск конфигураций...", затем перейдите на вкладку "Аргументы" и в разделе "Аргументы VM" добавьте запись свойства системы, например. -Dcatalina.base = C:\Programs\Apache-7.0.32-кот
Вы можете попытаться использовать depends-on
атрибут для вызова метода bean перед другими