Как установить переменную окружения или системное свойство в весенних тестах?
Я хотел бы написать некоторые тесты, которые проверяют конфигурацию XML Spring развернутой войны. К сожалению, некоторые компоненты требуют, чтобы некоторые переменные среды или свойства системы были установлены. Как я могу установить переменную среды до инициализации spring beans при использовании удобного стиля теста с @ContextConfiguration?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }
если я настраиваю контекст приложения с аннотациями, я не вижу крючка, где я могу что-то сделать до того, как контекст spring инициализированный.
5 ответов:
вы можете инициализировать системное свойство в статическом инициализаторе:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:whereever/context.xml") public class TestWarSpringContext { static { System.setProperty("myproperty", "foo"); } }
код статического инициализатора будет выполнен до инициализации контекста приложения spring.
правильный способ сделать это, начиная с весны 4.1, чтобы использовать
@TestPropertySource
Примечание.@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:whereever/context.xml") @TestPropertySource(properties = {"myproperty = foo"}) public class TestWarSpringContext { ... }
смотрите @TestPropertySource в Spring docs и Javadocs.
можно также использовать тестовый 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 { ... }
таким образом, можно избежать дублирования кода, если для всех модульных тестов должно быть установлено определенное системное свойство.
можно задать системные свойства в качестве аргументов виртуальной машины.
Если ваш проект является проектом 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) сделать следующее :
если вы хотите, чтобы ваши переменные были действительны для всех тестов, вы можете иметь
application.properties
файл в каталоге тестовых ресурсов (по умолчанию:src/test/resources
), который будет выглядеть примерно так:MYPROPERTY=foo
это будет загружаться и использоваться, если у вас нет определения через
@TestPropertySource
или аналогичный метод-точный порядок загрузки свойств можно найти в главе документации Spring 24. Внешняя Конфигурация.