Выбор ответа Senior Тестирование в Spring обновлено

@Transactional на тесте и AFTER_COMMIT

Вопрос

Тест с @Transactional проверяет, что после создания заказа отправляется письмо из @TransactionalEventListener(phase = AFTER_COMMIT). Письмо не отправляется. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Тестовая транзакция откатывается, коммита не бывает. Тестовый фреймворк в конце откатывает транзакцию, и фаза AFTERCOMMIT не наступает.

Варианты ответа

  1. TransactionalEventListener не работает в тестах
  2. Тестовая транзакция откатывается, коммита не бываетправильный ответ
  3. Нужно добавить @Async на слушатель события
  4. Почтовый сервис не замокан и падает молча

Разбор

Тестовый фреймворк в конце откатывает транзакцию, и фаза AFTER_COMMIT не наступает. Для таких тестов убирают @Transactional, очищают данные вручную или используют TestTransaction.flagForCommit(); TestTransaction.end();. В обычных тестах слушатель работает, а @Async ничего не изменит.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.