Оказывается, что @DataMongoTest
не активирует автоматическую настройку транзакций MongoDB. Я подал тикет в Spring Boot, чтобы это исправить. В то же время вы можете заставить это работать, добавив
@ImportAutoConfiguration(TransactionAutoConfiguration.class)
к вашему тестовому классу.
Обратите внимание, что использование транзакций MongoDB требует настройки базы данных набора реплик. Если это не дано, создание транзакции завершится неудачно, и ваш тестовый случай перехватит это исключение, и тест все равно будет успешным. Данные не будут вставлены, но это не из-за брошенного RuntimeException
, а из-за того, что транзакция не была запущена в первую очередь.
Ранее в этом вопросе было несколько иное расположение кода, из-за которого возникли другие проблемы. Для справки приведем предыдущий ответ:
@Transactional
необходимо использовать в publi c методах отдельного bean-компонента Spring, поскольку транзакционные логи c реализуются путем переноса цели объект с прокси-сервером, который содержит перехватчик, взаимодействующий с инфраструктурой транзакций.
В вашем примере есть две проблемы:
Сам тест не является компонентом Spring. Т.е. к 1023 * не добавлено транзакционное поведение. @Transactional
может использоваться в методах тестирования JUnit, но это контролирует транзакционное поведение теста. Наиболее важно откатить транзакцию, чтобы убедиться, что изменения в хранилище данных, сделанные в тесте, не влияют на другие тесты. См. этот раздел справочной документации.
Даже если бы к 1010 * применялись транзакционные логи c, локальный вызов метода никогда не будет вызвать его, поскольку он не пропускает прокси, который его применяет. Подробнее об этом см. В справочную документацию .
Решение вашей проблемы - создать отдельный компонент Spring, который содержит аннотацию @Transactional
, получить инъекцию в ваш тестовый пример и вызовите метод из теста.