Подтвердить что ты не робот

Как заставить новую версию контекста Spring ПЕРЕД испытанием

Я использую SpringJUnit4ClassRunner для написания тестов интеграции. Я также использую @DirtiesContext для тестов, которые оставляют контекст в разбитом состоянии позади, и это работает отлично.

Но теперь у меня есть тест, который устанавливает важный SystemProperty в статическом инициализаторе, который, в свою очередь, используется в контексте Spring. Это снова отлично работает, когда тест выполняется сам по себе. Но когда я запускаю тест с другими тестами, контекст Spring уже создается с использованием этого набора свойств и снова используется его новым тестом.

Как я могу заставить новое создание контекста Spring в моем тесте, который затем будет использовать измененное свойство System?

4b9b3361

Ответ 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 для этого теста, загрузив в него другую конфигурацию. Таким образом, ваш тест будет полностью независим от каждого другого теста.
  • Вы можете создать убранную конфигурацию для этого теста. Это достигнет того же, но будет быстрее.
  • Создайте тестовый набор, который сначала запускает этот тест.