Spring: откат транзакции в Unittest

#java #spring #spring-boot #transactions #spring-transactions

#java #spring #весенняя загрузка #транзакции #spring-транзакции

Вопрос:

У меня есть сложный метод обслуживания, который загружает много данных из базы данных. Поскольку он только считывает и проверяет данные, я хочу убедиться

  1. JPA (Hibernate) не тратит время на проверку большого контекста сохранения изменений.
  2. Никакие случайные изменения данных не записываются в БД.

Поэтому к концу моей службы у меня есть этот код

 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
  

В моих модульных тестах есть макеты для всего доступа к БД, поэтому транзакция не является проблемой. (У меня также есть интеграционный тест с @SpringBootTest и полной поддержкой trx.) К сожалению, оператор отката не выполняется в чистых модульных тестах.

Есть ли простой способ получить инструкцию отката, просто ничего не делая в случае модульного теста?

Комментарии:

1. Есть ли у вас автоматическое переключение в режим гибернации и каков уровень распространения для метода, который вы вызываете?

2. Это чистый модульный тест. Нет базы данных, спящего режима, транзакций. Я только хочу протестировать внутреннюю логику сервиса. Тот факт, что все откатывается, является просто мерой безопасности / производительности.

Ответ №1:

На данный момент я просто написал небольшой компонент, который легко издеваться:

 @Component
public class RollBacker {

    public void setRollBackOnly() {
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }

}
  

В конце концов, это одноэлементный подход TransactionAspectSupport , который затрудняет модульное тестирование здесь. ИМХО TransactionAspectSupport должен быть компонент spring.

Ответ №2:

Рассмотрите возможность использования @Transactional(readOnly=true) вместо TransactionAspectSupport.currentTransactionStatus().setRollbackOnly() .

Документ

Логический флаг, который может быть установлен в значение true, если транзакция доступна только для чтения, что позволяет выполнять соответствующую оптимизацию во время выполнения.

Комментарии:

1. Как упоминалось в вопросе, нет @SpringBootTest . У меня нет, и в данном случае мне не нужны транзакции или даже полный контекст приложения. Просто обычный ванильный модульный тест.