Выбор ответа Senior Тестирование в Spring обновлено
@Transactional на тесте и AFTER_COMMIT
Вопрос
Тест с @Transactional проверяет, что после создания заказа отправляется письмо из @TransactionalEventListener(phase = AFTER_COMMIT). Письмо не отправляется. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Тестовая транзакция откатывается, коммита не бывает. Тестовый фреймворк в конце откатывает транзакцию, и фаза AFTERCOMMIT не наступает.
Варианты ответа
- TransactionalEventListener не работает в тестах
- Тестовая транзакция откатывается, коммита не бываетправильный ответ
- Нужно добавить @Async на слушатель события
- Почтовый сервис не замокан и падает молча
Разбор
Тестовый фреймворк в конце откатывает транзакцию, и фаза AFTER_COMMIT не наступает. Для таких тестов убирают @Transactional, очищают данные вручную или используют TestTransaction.flagForCommit(); TestTransaction.end();. В обычных тестах слушатель работает, а @Async ничего не изменит.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.