Как установить переменную среды или системное свойство в тестах spring?
Я бы хотел написать несколько тестов, которые проверяют конфигурацию XML Spring развернутой WAR. К сожалению, некоторые beans требуют, чтобы были заданы некоторые переменные среды или системные свойства. Как установить переменную среды перед тем, как инициализировать Spring beans при использовании удобного стиля тестирования с помощью @ContextConfiguration?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }
Если я настраиваю контекст приложения с аннотациями, я не вижу крюка, где я могу что-то сделать до того, как будет инициализирован контекст Spring.
Ответы
Ответ 1
Вы можете инициализировать свойство System в статическом инициализаторе:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext {
static {
System.setProperty("myproperty", "foo");
}
}
Статический код инициализатора будет выполнен до инициализации контекста приложения spring.
Ответ 2
Правильный способ сделать это, начиная с Spring 4.1, заключается в использовании аннотации @TestPropertySource
.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
@TestPropertySource(properties = {"myproperty = foo"})
public class TestWarSpringContext {
...
}
См. @TestPropertySource в Spring docs и Javadocs.
Ответ 3
Можно также использовать тестовый ApplicationContextInitializer для инициализации системного свойства:
public class TestApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
{
@Override
public void initialize(ConfigurableApplicationContext applicationContext)
{
System.setProperty("myproperty", "value");
}
}
а затем сконфигурируйте его в тестовом классе в дополнение к файлам контекстного конфигурационного файла Spring:
@ContextConfiguration(initializers = TestApplicationContextInitializer.class, locations = "classpath:whereever/context.xml", ...)
@RunWith(SpringJUnit4ClassRunner.class)
public class SomeTest
{
...
}
Таким образом, можно избежать дублирования кода, если для всех модульных тестов необходимо установить определенное системное свойство.
Ответ 4
Вы можете установить Системные свойства как аргументы VM.
Если ваш проект - проект maven, вы можете выполнить следующую команду при запуске тестового класса:
mvn test -Dapp.url="https://stackoverflow.com"
Тестовый класс:
public class AppTest {
@Test
public void testUrl() {
System.out.println(System.getProperty("app.url"));
}
}
Если вы хотите запустить отдельный тестовый класс или метод в eclipse, тогда:
1) Перейти в Run → Run Configuration
2) С левой стороны выберите свой тестовый класс в разделе Junit.
3) сделать следующее:
![enter image description here]()
Ответ 5
Если вы хотите, чтобы ваши переменные были действительными для всех тестов, вы можете иметь файл application.properties
в каталоге ресурсов тестирования (по умолчанию: src/test/resources
), который будет выглядеть примерно так:
MYPROPERTY=foo
Затем он будет загружен и использован, если у вас нет определений с помощью @TestPropertySource
или аналогичного метода - точный порядок загрузки свойств можно найти в главе 24 документации Spring . Внешняя конфигурация.
Ответ 6
Все ответы здесь в настоящее время говорят только о системных свойствах, которые отличаются от переменных среды, которые сложнее установить, особенно. для испытаний. К счастью, ниже класс может быть использован для этого, и у класса документов есть хорошие примеры
EnvironmentVariables.html
Быстрый пример из документации, модифицированной для работы с @SpringBootTest
@SpringBootTest
public class EnvironmentVariablesTest {
@ClassRule
public final EnvironmentVariables environmentVariables = new EnvironmentVariables().set("name", "value");
@Test
public void test() {
assertEquals("value", System.getenv("name"));
}
}
Ответ 7
Для модульных тестов системная переменная еще не создается, когда я выполняю "mvn clean install", потому что на сервере не запущено приложение. Поэтому, чтобы установить свойства системы, мне нужно сделать это в pom.xml. Вот так:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<systemPropertyVariables>
<propertyName>propertyValue</propertyName>
<MY_ENV_VAR>newValue</MY_ENV_VAR>
<ENV_TARGET>olqa</ENV_TARGET>
<buildDirectory>${project.build.directory}</buildDirectory>
</systemPropertyVariables>
</configuration>
</plugin>