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 ответов

21 просмотр

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 началось...

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

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

Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
9
> Копаем глубже > Следующий момент был, когда я спросил его, знает ли он JavaScript. Он ответил, что его учили работать с C#. Я тоже в университете писал на C#, но даже там мн...
Oleg Volkov
4
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
7
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
Карта сайта