170 похожих чатов

Коллеги, добрый день, помогите разобраться разобраться с магией @Transactional Есть методы

сервиса, которые добавляют/удаляют в энтити новую роль (и есесно записывают через хибер в БД). В рантайме всё замечательно работает.

Пишу тесты на сервис: создаю тестового юзера, записываю в БД, выполняю тестируемый метод, делаю проверки.
По отдельности тесты работают ок, но т.к. тест-кейсов более одного, то БД не даёт сохранить тестового юзера на втором и далее тесте, т.к. уже нет уникальности.
Тогда вешаю @Transactional на класс тестов, чтобы изменения после откатывались метода откатывались (в других тест-классах проекта реализовано так же).
НО тогда в моменте user.getRoles().add(role) получаю:
java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:71)
at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.add(ImmutableCollections.java:75)
at org.hibernate.collection.internal.PersistentSet.add(PersistentSet.java:211)

Где искать зарытую собаку?

13 ответов

13 просмотров

1. Общую Transactional нужно убрать - по моему это боьшое зло и код будет отрабатывать иначе - что-то будет доставаться из кэша ИМЕННО В ТЕСТАХ - где-то это будет один и тот же обьект и полезут всякие артифакты. 2. Может в конце каждого теста - чистить сущности просто

Какую именно коллекцию ты сохраняешь как роли у юзера? Если List.of то она неизменяемая и обычно у неё такие ошибки летят

Ещё говорят что правильно делать так чтобы тесты никак не влияли друг на друга по этому по хорошему тебе нужен свой уникальный пользователь для каждого теста

Sergey-Pavlenko Автор вопроса
Vasily Shvets
1. Общую Transactional нужно убрать - по моему это...

в сервисе нет метода удаления юзера, придётся подключать UserDao и делать это напрямую, но это вариант. сейчас попробую.

Sergey-Pavlenko Автор вопроса
Sleeping Yaroslav
Какую именно коллекцию ты сохраняешь как роли у юз...

роли достаются через дао юзера: User user = userDao.getById(userId); user.getRoles().add(role); само поле - простой Set<AccessRole> https://pastebin.com/ieyzaHb5

Sergey-Pavlenko Автор вопроса
Sleeping Yaroslav
Ещё говорят что правильно делать так чтобы тесты н...

возможно. попробовал генерить случайных юзеров и конечно заработало без Transactional

Sergey Pavlenko
роли достаются через дао юзера: User user = us...

Посмотри какая именно коллекция у roles в дебаге, уже просто интересно) Ну если не сложно)

Sergey Pavlenko
в сервисе нет метода удаления юзера, придётся подк...

По-хорошему тест обязан подчищать за собой

Sergey-Pavlenko Автор вопроса
Etki
По-хорошему тест обязан подчищать за собой

ну вот это и было реализовано через Transactional, судя по другим тест-классам, которые писались не мной, применил такую же логику и получил такое

можешь попробовать делать entityManager.clear() между тестами чтобы быть уверенным что ничего из кеша не прилетает

Sergey-Pavlenko Автор вопроса
Sleeping Yaroslav
Посмотри какая именно коллекция у roles в дебаге, ...

PersistentSet ну собсно это и было в стеке: at org.hibernate.collection.internal.PersistentSet.add(PersistentSet.java:211) опять же.. в рантайме то всё ок, а при наличии Transactional началось...

Похожие вопросы

Обсуждают сегодня

Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
10
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
Есть предложения, как подобное можно упростить?
Hemul GM
12
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
У меня вопросик назрел. Почему, создав класс без наследования и реализации деструктора Destroy, деструктор не вызывался при free. Потом указал наследование от tobject и overri...
Сергей Бычков
9
@y0zhig @shizzard А можно я опишу цель и может вообще ерланг мне не подходит. На текущий момент как я понимаю у ерланга есть легковесные потоки и задача выполняется в каком т...
Дмитрий Спиридонов
4
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString): AnsiString; Как мне в её теле сделать вот так? Result:=Concat(a); А не грустный вариан...
notme
15
just use free version ?? pycharm has a free version
Fan / Ac
9
Карта сайта