Как заставить новую версию контекста Spring ПЕРЕД испытанием
Я использую SpringJUnit4ClassRunner
для написания тестов интеграции. Я также использую @DirtiesContext
для тестов, которые оставляют контекст в разбитом состоянии позади, и это работает отлично.
Но теперь у меня есть тест, который устанавливает важный SystemProperty в статическом инициализаторе, который, в свою очередь, используется в контексте Spring. Это снова отлично работает, когда тест выполняется сам по себе. Но когда я запускаю тест с другими тестами, контекст Spring уже создается с использованием этого набора свойств и снова используется его новым тестом.
Как я могу заставить новое создание контекста Spring в моем тесте, который затем будет использовать измененное свойство System?
Ответы
Ответ 1
В соответствии с Spring 4.2 аннотация DirtiesContext поддерживает следующие новые этапы: BEFORE_CLASS, BEFORE_EACH_TEST_METHOD и BEFORE_METHOD. Итак, теперь вы можете сделать это:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(...)
@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
public class MyTest {
..
}
Ответ 2
Pre- Spring 4.2:
Я могу только предложить хак, к сожалению - вы правы, похоже, нет простого способа инициализировать новый контекст приложения, а не использовать кешированный контекст приложения. Вот некоторые из обходных решений, которые я могу предложить:
-
Используйте немного отличающийся @ContextConfiguration
- быстрый и грязный способ сделать это может заключаться в добавлении аннотации @ActiveProfiles
к тестовому классу, таким образом Spring будет вынужден кэшировать контекст с помощью новый ключ ИЛИ определить фиктивный контекст с вашей существующей конфигурацией в качестве импорта
-
Взломать, но JUnit 4.11+ позволяет некоторый уровень контроля над порядком метода тестирования, возможно, у вас есть метод тестирования прямо перед вашим целевым тестовым методом и с помощью метода фиктивного теста, аннотированного с помощью @DirtiesContext
, это когда ваш целевой метод будет вызван новым контекстом.
Ответ 3
Существует несколько вариантов:
- Вы можете создать индивидуальный контекст spring для этого теста, загрузив в него другую конфигурацию. Таким образом, ваш тест будет полностью независим от каждого другого теста.
- Вы можете создать убранную конфигурацию для этого теста. Это достигнет того же, но будет быстрее.
- Создайте тестовый набор, который сначала запускает этот тест.