问题 使用Maven 2和Glassfish 3对EJB进行单元测试


我一直在尝试设置我的应用程序,以便我可以整天测试它的EJB,但我似乎无法通过看似简单的问题。

我在NetBeans 6.9中设置了标准的Maven Web应用程序。我已经自动为其中一个EJB生成了单元测试,但每当我去运行它时,我都会收到错误消息:

Testcase: initializationError(com.example.ExampleTest): Caused an ERROR
Absent Code attribute in method that is not native or abstract in class file javax/ejb/embeddable/EJBContainer
java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/ejb/embeddable/EJBContainer
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)

我已经研究了这个,我很确定问题是我的pom当前指向一个只包含API的jar

<dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>

不是和可用于运行测试的实现。我很确定测试在@BeforeClass标记的方法尝试执行时失败了

container = EJBContainer.createEJBContainer();

标准推荐的解决方案是将glassfish-embedded-all工件添加为具有测试范围的第一个项目依赖项

<dependency>
            <groupId>org.glassfish.extras</groupId>
            <artifactId>glassfish-embedded-all</artifactId>
            <version>3.0.1</version>
            <scope>test</scope>
        </dependency>

我可以在这里找到这个工件的Maven包: http://download.java.net/maven/glassfish/ 但是Nexus不会将此目录或任何子目录识别为Maven 2存储库。我想我可以下载jar并手动将其安装到Nexus中,但这似乎打败了安装Nexus的人。

那么,是否有一个Maven存储库,Nexus能够编制索引以便为我提供glassfish-embedded-all工件?我读过的一些帖子提到现在正在使用的正确工件是javax.ejb,但我找不到更多的运气了。

你可能已经猜到我对单元测试是全新的,而且对JEE6来说还是比较新的;这甚至是单元测试EJB的正确方法吗?


2961
2017-08-05 14:35


起源



答案:


(...)标准推荐的解决方案是将glassfish-embedded-all工件添加为具有测试范围的第一个项目依赖项

实际上,你需要一个类似的实现 glassfish-embedded-all 要么 glassfish-embedded-web 如果你只是使用网络资料,这似乎是你的情况(我不知道网络资料提供 EJBContainer 顺便一提)。

确切地说,这个工件不一定是“第一”依赖,而是它 必须 被宣布 之前 该 javaee-api 神器。

那么,是否有一个Maven存储库,Nexus能够编制索引以便为我提供glassfish-embedded-all工件?

我无法重现这个问题 http://download.java.net/maven/glassfish/ 但似乎JBoss Nexus存储库确实拥有它(可能是因为它们使用它 的Arquillian):

<repository>
  <id>jboss-public-repository-group</id>
  <name>JBoss Public Maven Repository Group</name>
  <url>https://repository.jboss.org/nexus/content/groups/public</url>
</repository>

这甚至是单元测试EJB的正确方法吗?

单元测试通常在容器外部进行,并且是隔离的(使用Mocking框架),因此我不会调用该单元测试。但对于集成/功能测试(容器内), EJBContainer API非常好,非常好。

也可以看看


13
2017-08-05 15:33



谢谢Pascal,像往常一样出色的答案。不幸的是,这并没有解决我的问题。我想我必须正确配置Nexus或其他东西。我已经尝试设置你建议的存储库和这个存储库 repository.jboss.org/nexus/content/repositories/glassfish 并且在“浏览索引”选项卡下都没有显示任何要下载的内容(如果您熟悉Nexus)。我在Nexus下配置了4或5个其他maven资源库,所以我无法理解为什么这些资源被证明是如此麻烦。我甚至试过设置一个完全干净的Nexus安装 - 仍然没有快乐。 - wobblycogs
@wobblycogs关于 download.java.net/maven/glassfish,请注意,此存储库不提供Nexus索引(a .index 如果Nexus没有从中下载工件,我不希望在浏览索引选项卡中看到任何内容。然而, repository.jboss.org/nexus/content/groups/public 肯定的。但是你启用了吗? 远程存储库索引下载?看到 sonatype.com/books/nexus-book/reference/...。无论如何,代理功能是否真的有效(你的maven客户端是否成功下载了工件)? - Pascal Thivent
@pascal是的,索引下载已启用,在Nexus日志中我得到:在存储库ID ='jboss-glassfish'中从路径='/ .index'中止,原因:在存储库中的路径“/.index”中找不到项目“的jboss-GlassFish的”!不,我似乎无法下载任何文物 那 库。我尝试将存储库添加到我的settings.xml中但这对我得到的任何内容都无济于事:无法在存储库jboss-glassfish中找到资源'org.glassfish.extras:glassfish-embedded-all:jar:3.0.1'(repository.jboss.org/nexus/content/repositories/glassfish) - 奇怪,因为该URL是正确的。 - wobblycogs
@wobblycogs好吧,我担心我无法继续提供帮助,因为我无法重现这个问题。我刚尝试过(两者兼而有之 repository.jboss.org/nexus/content/repositories/glassfish 和 repository.jboss.org/nexus/content/groups/public)它对我有用。 - Pascal Thivent
对于读这个问题的任何人,我很高兴地报告说我已经解决了这个问题并且我实际上已经进行了一些测试。主要问题似乎是Nexus拒绝寻找玻璃鱼嵌入式的所有工件。通过摆弄它我设法得到它下载它但它打破了许多其他我没有触及的存储库。最终我放弃了从头开始重新设置Nexus。现在所有工件都下载得很好,我只能假设Nexus存储库以某种方式损坏了。 - wobblycogs


答案:


(...)标准推荐的解决方案是将glassfish-embedded-all工件添加为具有测试范围的第一个项目依赖项

实际上,你需要一个类似的实现 glassfish-embedded-all 要么 glassfish-embedded-web 如果你只是使用网络资料,这似乎是你的情况(我不知道网络资料提供 EJBContainer 顺便一提)。

确切地说,这个工件不一定是“第一”依赖,而是它 必须 被宣布 之前 该 javaee-api 神器。

那么,是否有一个Maven存储库,Nexus能够编制索引以便为我提供glassfish-embedded-all工件?

我无法重现这个问题 http://download.java.net/maven/glassfish/ 但似乎JBoss Nexus存储库确实拥有它(可能是因为它们使用它 的Arquillian):

<repository>
  <id>jboss-public-repository-group</id>
  <name>JBoss Public Maven Repository Group</name>
  <url>https://repository.jboss.org/nexus/content/groups/public</url>
</repository>

这甚至是单元测试EJB的正确方法吗?

单元测试通常在容器外部进行,并且是隔离的(使用Mocking框架),因此我不会调用该单元测试。但对于集成/功能测试(容器内), EJBContainer API非常好,非常好。

也可以看看


13
2017-08-05 15:33



谢谢Pascal,像往常一样出色的答案。不幸的是,这并没有解决我的问题。我想我必须正确配置Nexus或其他东西。我已经尝试设置你建议的存储库和这个存储库 repository.jboss.org/nexus/content/repositories/glassfish 并且在“浏览索引”选项卡下都没有显示任何要下载的内容(如果您熟悉Nexus)。我在Nexus下配置了4或5个其他maven资源库,所以我无法理解为什么这些资源被证明是如此麻烦。我甚至试过设置一个完全干净的Nexus安装 - 仍然没有快乐。 - wobblycogs
@wobblycogs关于 download.java.net/maven/glassfish,请注意,此存储库不提供Nexus索引(a .index 如果Nexus没有从中下载工件,我不希望在浏览索引选项卡中看到任何内容。然而, repository.jboss.org/nexus/content/groups/public 肯定的。但是你启用了吗? 远程存储库索引下载?看到 sonatype.com/books/nexus-book/reference/...。无论如何,代理功能是否真的有效(你的maven客户端是否成功下载了工件)? - Pascal Thivent
@pascal是的,索引下载已启用,在Nexus日志中我得到:在存储库ID ='jboss-glassfish'中从路径='/ .index'中止,原因:在存储库中的路径“/.index”中找不到项目“的jboss-GlassFish的”!不,我似乎无法下载任何文物 那 库。我尝试将存储库添加到我的settings.xml中但这对我得到的任何内容都无济于事:无法在存储库jboss-glassfish中找到资源'org.glassfish.extras:glassfish-embedded-all:jar:3.0.1'(repository.jboss.org/nexus/content/repositories/glassfish) - 奇怪,因为该URL是正确的。 - wobblycogs
@wobblycogs好吧,我担心我无法继续提供帮助,因为我无法重现这个问题。我刚尝试过(两者兼而有之 repository.jboss.org/nexus/content/repositories/glassfish 和 repository.jboss.org/nexus/content/groups/public)它对我有用。 - Pascal Thivent
对于读这个问题的任何人,我很高兴地报告说我已经解决了这个问题并且我实际上已经进行了一些测试。主要问题似乎是Nexus拒绝寻找玻璃鱼嵌入式的所有工件。通过摆弄它我设法得到它下载它但它打破了许多其他我没有触及的存储库。最终我放弃了从头开始重新设置Nexus。现在所有工件都下载得很好,我只能假设Nexus存储库以某种方式损坏了。 - wobblycogs