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

23 просмотра

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта