【问题标题】:unit testing EJBs with Maven 2 and Glassfish 3使用 Maven 2 和 Glassfish 3 对 EJB 进行单元测试
【发布时间】:2010-08-05 14:35:45
【问题描述】:

我一直在尝试设置我的应用程序,以便整天对它的 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>

Not 和可用于运行测试的实现。我很确定测试在尝试执行时在标有@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 进行单元测试的正确方法吗?

【问题讨论】:

    标签: java unit-testing maven-2 glassfish ejb-3.1


    【解决方案1】:

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

    确实,如果您只使用网络配置文件,您需要像 glassfish-embedded-allglassfish-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 进行单元测试的正确方法吗?

    单元测试通常是在容器外部和隔离的(使用模拟框架)完成的,所以我不会称之为单元测试。但是对于集成/功能测试(容器内),EJBContainer API 非常棒,非常完美。

    另见

    【讨论】:

    • 谢谢帕斯卡,一如既往的出色回答。不幸的是,它没有解决我的问题。我想我一定是错误地配置了 Nexus 之类的。我已经尝试设置您建议的存储库和这个repository.jboss.org/nexus/content/repositories/glassfish 并且从未在“浏览索引”选项卡下显示任何要下载的内容(如果您熟悉 Nexus)。我在 Nexus 下配置了 4 或 5 个其他 maven 存储库,所以我不明白为什么这些存储库会带来这么多麻烦。我什至尝试设置一个完全干净的 Nexus 安装 - 仍然没有乐趣。
    • @wobblycogs 关于download.java.net/maven/glassfish,请注意此存储库不提供 Nexus 索引(根目录下的 .index 目录),因此我不希望在浏览索引选项卡中看到任何内容如果 Nexus 没有从中下载工件。但是,repository.jboss.org/nexus/content/groups/public 绝对可以。但是您是否启用了远程存储库索引下载?见sonatype.com/books/nexus-book/reference/…。无论如何,代理功能是否真的有效(您的 maven 客户端是否成功下载工件)?
    • @pascal 是的,索引下载已启用,在 Nexus 日志中我得到:Aborted walk on repository ID='jboss-glassfish' from path='/.index',原因:找不到项目存储库“jboss-glassfish”中的路径“/.index”!。不,我似乎无法从 that 存储库下载任何工件。我尝试将存储库添加到我的 settings.xml 但这并没有帮助我只是得到: Unable to find resource 'org.glassfish.extras:glassfish-embedded-all:jar:3.0.1' in repository jboss-glassfish ( repository.jboss.org/nexus/content/repositories/glassfish) - 奇怪,因为那个 URL 是正确的。
    • @wobblycogs 好吧,恐怕我无法提供进一步的帮助,因为我无法重现该问题。我刚试过(repository.jboss.org/nexus/content/repositories/glassfishrepository.jboss.org/nexus/content/groups/public),它对我有用。
    • 对于阅读此问题的任何人,我很高兴地报告我已经解决了这个问题并且我实际上已经运行了一些测试。主要问题似乎是 Nexus 拒绝寻找 glassfish-embedded-all 人工制品。通过摆弄它,我设法让它下载它,但它破坏了许多我没有接触过的其他存储库。最终我放弃并从头开始重新设置 Nexus。现在所有工件都可以正常下载,我只能假设 Nexus 存储库以某种方式损坏了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2012-03-03
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多