Как я могу выполнить улучшение времени сборки объектов JPA при выполнении теста Arquillian?

Технологический стек: Arquillian Embedded-Tomee, HSQLDB, openJpa, jdk 1.8.

Я потратил несколько дней, пытаясь понять, как я могу заставить все это работать вместе, и очень близко подошел к ИМО. И теперь я застрял с этой очень общей ошибкой.

<openjpa-2.4.0-r422266:1674604 fatal general error>
org.apache.openjpa.persistence.PersistenceException: null

Все мои объекты добавлены в test-persistence.xml и правильно размещен под src/test/resources,

Начальная проблема, которую я попытался установить Runtime Unenhanced Classes в supported и надеется, что улучшение произойдет во время выполнения внутри Arquillian-Embedded-Tomee контейнер. Не повезло там. Получал сообщение об ошибке, что некоторые из моих сущностей не имели общедоступного / защищенного конструктора без аргументов, который необходим для улучшения времени выполнения.ПРИМЕЧАНИЕ. Улучшение среды выполнения прекрасно работает внутри фактически развернутого контейнера Tomee. Просто не работает внутри Arquillian.

Первый подход для решения вышеуказанной проблемы: я не хотел показывать свои объекты как общедоступные. Так что перешел на build-time-enhancement с использованием openjpa maven plugin как описано здесь. Был некоторый успех с этим подходом. Может на самом деле увидеть и проверить это во время работы mvn clean install сущности были усилены.

построить вывод:

 --- openjpa-maven-plugin:1.2:enhance---
some-persistent-unit  INFO   [main] openjpa.Tool - Enhancer running on 
type "class someClass".
some-persistent-unit  INFO   [main] openjpa.Tool - Enhancer running on 
type "class someotherclass".

и так далее...

Но проблема здесь в следующем: тесты проходят только во время сборки maven. Если я попытаюсь запустить отдельные тесты в тестовом классе или все тесты в этом тестовом классе, они не пройдут. А также в этом подходе я отключил поддержку времени выполнения для необработанных классов в моем постоянном контексте.

<property name="openjpa.RuntimeUnenhancedClasses" value="unsupported"/>

из-за чего я пришел к выводу, что openjpa-maven-plugin работал как положено.

Вопрос 1: это ожидаемое поведение? Тесты не работают вне сборки maven? Вопрос 2: предоставляет ли плагин openjpa javaagent за кулисами?

Не зная, что делать, я переключился на другой (???) подход: попытался запустить улучшение с помощью javaagent как описано в аналогичном вопросе, размещенном здесь. Не имел успеха с этим. Заканчивается приведенной ниже ошибкой:

<<< ERROR! org.apache.openjpa.persistence.ArgumentException: This 
configuration disallows runtime optimization, but the following listed types 
were not enhanced at build time or at class load time with a javaagent: "
List of entities described in test-persistence.xml

Вопрос 3. Итак, как я могу настроить улучшение времени сборки, а также убедиться, что улучшения работают для каждого модульного теста, который я запускаю?

Вопрос 4: Еще лучше, как я могу (если это возможно) настроить улучшение времени сборки, чтобы оно происходило только для тестов, работающих внутри Arquillian.

Или я с самого начала подхожу к этому неправильно?

1 ответ

В1: если ваша IDE не запускает плагин openjpa, а только выполняет компиляцию, вы пропустите улучшение да

Q2: нет, и плагин, и javaagent используют одну и ту же реализацию расширения, но вы можете видеть их как разные хуки (сборка против времени выполнения)

Q3: зависит от вашей IDE, с eclipse вам нужен плагин жизненного цикла для настройки openjpa, а с Intellij вам нужно добавить openjpa: Improve после фазы Make в конфигурации run

Q4: с пультом Tomee это делается автоматически

Я думаю, что использование javaagent по-прежнему является лучшим способом решения проблемы улучшения, вам просто нужно убедиться, что maven и / или ваша тестовая конфигурация имеют -javaagent:/path/to/openejb-javaagent.jar

Другие вопросы по тегам