Как откатить юнит-тест, пока сервисный уровень равен @Transactional
Я использую Springboot 1.5.2.RELEASE, и мои классы обслуживания помечены как
@Service
@Transactional(rollbackFor = Exception.class)
мой класс модульного теста помечен:
@RunWith(SpringRunner.class)
@SpringBootTest
ТРЕБОВАНИЕ: откат изменений, внесенных в базу данных по методам модульного тестирования после завершения теста.
одно из предложенных решений: добавить @Transactional
аннотации к тестовому классу, я пробовал, но это решение вызывает некоторые проблемы, так как иногда тестовая транзакция откатывается (даже без исключения!) до завершения сервисной транзакции!
Можно ли дать еще одно хорошее решение для теста отката?
3 ответа
Решение с @Transactional
на тестовом классе это стандартный способ сделать это. Spring Tx никоим образом не откатит транзакцию неожиданно, поэтому я бы порекомендовал рассмотреть проблемы, с которыми вы столкнулись, вместо того, чтобы придумывать другие решения.
Все изменения будут отменены, если не было изменено поведение по умолчанию. И у вас нет классов / методов с уровнем распространения транзакции = REQUIRES_NEW, так как он запускает независимую транзакцию и может независимо фиксировать или откатывать с внешней транзакцией
Откат транзакции и фиксация поведения
По умолчанию тестовые транзакции будут автоматически откатываться после завершения теста; однако поведение транзакционной фиксации и отката может быть настроено декларативно с помощью аннотаций @Commit и @Rollback.
@Rollback
@Rollback указывает, следует ли откатить транзакцию для метода транзакционного метода после его завершения. Если true, транзакция откатывается; в противном случае транзакция фиксируется (см. также @Commit). Семантика отката для интеграционных тестов в Spring TestContext Framework по умолчанию имеет значение true, даже если @Rollback явно не объявлен.
При объявлении аннотации на уровне класса @Rollback определяет семантику отката по умолчанию для всех методов тестирования в иерархии классов тестирования. Когда @Rollback объявлен как аннотация уровня метода, он определяет семантику отката для конкретного метода тестирования, потенциально переопределяя семантику @Rollback или @Commit на уровне класса.
Из документов:
По умолчанию тестовые транзакции будут автоматически откатываться после завершения теста; однако поведение транзакционной фиксации и отката может быть настроено декларативно с помощью аннотаций @Commit и @Rollback.
Ваш комментарий:
иногда тестовая транзакция откатывается (даже без исключений!) до завершения сервисной транзакции!
не имеет смысла для меня. Как вы узнали, завершился ли TXN или нет, если он был откат? Исключения не имеют значения для тестов, как я цитировал выше.