技术栈:Arquillian Embedded-tomee、HSQLDB、openJpa、jdk 1.8。
我花了几天时间试图弄清楚如何让这一切一起工作,并且已经非常接近 IMO。现在我被这个非常普遍的错误困住了。
<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 内部运行的测试进行。
还是我一开始就错了?