Сварка и джунит, нет менеджера транзакций - PullRequest
0 голосов
/ 16 января 2020

У меня есть несколько тестов интеграции в стиле джунта, где инжекцией занимается Weld. Я в состоянии внедрить entityManager очень хорошо, и все, кажется, хорошо, когда мой тестируемый код выполняет некоторую операцию с моим entityManager ... за исключением того, что на самом деле ничего не записывается в мою базу данных H2 в памяти ... никаких вставок, обновлений что-нибудь. Это вызвано отсутствием доступных транзакций из того, что я могу сказать. Когда я запускаю тест, журналы информируют меня об этом:

Транзакционные сервисы недоступны. Инъекция @Inject UserTransaction недоступна. Наблюдатели за транзакциями будут вызываться синхронно.

Есть ли нормальный / типичный способ сделать это? Я обнаружил только следующее: https://in.relation.to/2019/01/23/testing-cdi-beans-and-persistence-layer-under-java-se/, что несколько приближается к тому, что мне нужно (я использую аннотацию @Transactional в тестируемом коде), но похоже, что мне нужно заново изобрести weel. Неужели нет простого способа сделать это?

1 Ответ

1 голос
/ 20 января 2020

Если UserTransaction недоступен, это, скорее всего, означает, что вы не настроили менеджер транзакций. Возможности @Transactional и @Inject UserTransaction определены в JTA spe c, который реализуется менеджером транзакций.

Сварка используется в WildFly и хорошо интегрируется с Narayana. Это один из вариантов для вас go (отказ от ответственности: я разработчик в http://narayana.io проекте).

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

<groupId>org.jboss.narayana.jta</groupId>
<artifactId>cdi</artifactId>

Затем вы должны реализовать интерфейс SPI Weld поверх него (пример здесь приведен в кратком обзоре Narayana: https://github.com/jbosstm/quickstart/blob/master/jta-1_2-standalone/src/test/java/org/jboss/narayana/quickstarts/jta/cdi/CDITransactionServices.java)

Я написал сообщение в блоге об этом, и вы можете найти более подробную информацию здесь: http://jbossts.blogspot.com/2019/04/jta-and-cdi-integration.html

Если у вас возникла проблема с переносом зависимости менеджера транзакций в ваш проект - я понимаю может возникнуть беспокойство по поводу расширения списка зависимостей или о некотором влиянии на производительность (даже я считаю это беспокойство безосновательным, но это другое обсуждение) - тогда вам нужно будет настроить EntityManager для работы с локальной транзакцией. Использование <non-jta-data-source> может помочь здесь. Hibernate должен выполнить запрос вставки внутри транзакции. Это обязательное условие.

Имейте в виду, что если вы настроите EntityManager для использования локальных транзакций ресурса, тесты могут начать работать, но вы все равно не сможете использовать @Inject UserTransaction или @Transactional, поскольку они являются возможностями, предоставляемыми Менеджер транзакций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...