如何在运行Arquillian测试时执行JPA实体的构建时增强?

时间:2017-05-22 01:08:11

标签: java unit-testing openjpa jboss-arquillian openjpa-maven-plugin

技术堆栈: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内部没有工作。

解决上述问题的第一种方法: 我不想公开我的实体。因此,如here所述,使用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尝试了针对类似问题posted here所述的运行增强功能。这没有成功。 结束以下错误:

<<< 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:更好的我怎么能(如果是popssible)设置构建时间增强只发生在Arquillian内部运行的测试。

或者我开始接近这一切都错了吗?

1 个答案:

答案 0 :(得分:0)

Q1:如果您的IDE没有运行openjpa插件但只进行编译,那么您将错过增强功能是

Q2:不,插件和javaagent都使用相同的增强实现,但你可以将它们视为不同的钩子(构建与运行时)

Q3:取决于您的IDE,使用eclipse需要生命周期插件来配置openjpa,使用Intellij需要添加openjpa:在运行配置中的Make阶段后增强

问题4:使用tomee遥控器,它会自动完成

我认为使用javaagent仍然是解决增强的最佳方法,你真的需要确保maven和/或你的测试配置有-javaagent:/path/to/openejb-javaagent.jar