Я не могу комментировать на стороне JHipster, но одной из возможных причин является то, что поведение «Test Transactional» не применяется к тестовому коду.
Просто для пояснения, по умолчанию, если вы делаете тест как @Транзакционный, пружина открывает одну транзакцию, тест запускается, и когда он завершается (независимо от того, прошел он или нет), транзакция выполняет откат, эффективно очищая базу данных.
Теперь я не вижу этого втесты, поэтому, вероятно, вы не используете это поведение.Но это чистая пружина, а не пружинный башмак.
Теперь что касается пружинного чехла.
Если вы используете @SpringBootTest
с конкретной конфигурацией ExchangeApp
, в этом случае, шансычто он не будет загружать какие-либо автоконфигурации (например, те, которые определяют конфигурации, работающие с транзакциями, управлением источниками данных и т. д.).
Если вы хотите «имитировать» загрузку микросервиса, вам следуетзапустить @SpringBootTest
без конфигураций, но это выходит за рамки вопроса.
A "by the book" способ весенней загрузки для тестирования DAO с Hibernate использует @DataJpaTest
, который загружает только вещи, связанные с базой данных, но этоне может быть использован с @SpringBootTest
- вы должны выбрать один.
Так что для меня ясно, что тест делает что-то хитрое и определенно не то, что следует правилам весенней загрузки, поэтому, вероятно, весенняя / весенняя загрузка наносит ответный удар:)
Теперь об асинхронных вещах.Это также может внести свой вклад в беспорядок, потому что поддержка транзакций весной сильно зависит от концепции Thread Local, поэтому, когда новый поток исполняется (в другом пуле потоков или что-то еще), информация о транзакции не распространяется, поэтому Spring не может понять, что еевсе еще в той же транзакции.Я вижу, что вы используете TransactionSynchronizationManager
, но без отладки трудно сказать, что происходит.
Теперь, чтобы проверить, почему транзакция не распространяется, я думаю, что вы должны отладить приложение и посмотреть:
- Обернуты ли службы в прокси-сервер, поддерживающий транзакции (это то, что делает
@Transactional
, при условии применения соответствующего BeanPostProcessor) - Проверьте, что на каждом шаге вы находитесь в транзакции
- Подумайте об использовании @Transactional для теста / контрольного примера, чтобы он очистил изменения, которые были применены во время теста