У меня 3 группы тестов: юнит, интеграция, приемка.
- Последние две группы запускают ApplicationContext: минимальный для «интеграции» и полный для «принятия».
- В обоих контекстах приложения регистрируется очередь подписчика.
- Контексты приложения отменяются в конце всего теста (
@RunWith(SpringRunner.class)
)
Когда я запускаю «все тесты», запускаются 2 разных контекста приложения, и у меня дублируются подписчики очереди.
Я знаю следующие обходные пути для этого дублирования подписчиков:
- никогда не запускать интеграцию и приемочные испытания вместе
- использовать прикладной контекст «приемка» для «интеграционных» тестов. Недостаток: тестовый запуск займет больше времени.
- добавить статический реестр и вручную добавить / удалить слушателей. Недостаток: слишком сложный и легко забываемый
Есть ли какой-нибудь удобный способ выгрузить контекст приложения после группы тестов?
ОБНОВЛЕНИЕ на основе ndrone ответ
@DirtiesContext
идеально подходит
- еще один вариант - ограничить число кэшированных ApplicationContexts одним с
spring.test.context.cache.maxSize=1
Пример тестового суперкласса с контекстом грязи
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@TestExecutionListeners({FlywayTestExecutionListener.class, DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public abstract class AcceptanceTest {}