Я хотел бы написать несколько тестов, которые проверяют конфигурацию XML Spring развернутой WAR. К сожалению, некоторые bean-компоненты требуют, чтобы были установлены некоторые переменные среды или системные свойства. Как я могу установить переменную среды до инициализации Spring beans при использовании удобного стиля тестирования с @ContextConfiguration?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }
Если я настраиваю контекст приложения с помощью аннотаций, я не вижу ловушки, где я могу что-то сделать до инициализации контекста Spring.
java
spring
environment-variables
spring-test
Ханс-Петер Штёрр
источник
источник
@BeforeClass
способ установки системного свойства и@AfterClass
метод его удаления также будут работать, и после этого будет хорошо очищаться. (Хотя не пробовал.)Правильный способ сделать это, начиная с Spring 4.1, - использовать
@TestPropertySource
аннотацию.@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:whereever/context.xml") @TestPropertySource(properties = {"myproperty = foo"}) public class TestWarSpringContext { ... }
См. @TestPropertySource в документации Spring и Javadocs .
источник
@TestPropertySource(properties={"spring.cloud.config.label=feature/branch"})
Environment
свойство, которое отличается от «переменной среды».Также можно использовать тестовый 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 { ... }
Таким образом можно избежать дублирования кода, если для всех модульных тестов необходимо установить определенное системное свойство.
источник
@SpringBootTest
или любой из аннотаций тестовых срезов )Все ответы здесь в настоящее время говорят только о системных свойствах, которые отличаются от переменных среды, которые сложнее установить, особенно. для тестов. К счастью, для этого можно использовать класс ниже, и в документации класса есть хорошие примеры
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")); } }
источник
Если вы хотите, чтобы ваши переменные были действительными для всех тестов, вы можете иметь
application.properties
файл в каталоге тестовых ресурсов (по умолчанию :),src/test/resources
который будет выглядеть примерно так:Затем он будет загружен и использован, если у вас нет определений через
@TestPropertySource
или аналогичный метод - точный порядок, в котором загружаются свойства, можно найти в главе 24. Внешняя конфигурация документации Spring .источник
Вы можете установить свойства системы как аргументы виртуальной машины.
Если ваш проект является проектом 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) сделать следующее:
источник
Для модульных тестов системная переменная еще не создается, когда я выполняю «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>
источник