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

时间:2010-08-05 14:35:46

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

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

1 个答案:

答案 0 :(得分:13)

  

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

实际上,如果您只使用网络个人资料,则需要glassfish-embedded-allglassfish-embedded-web这样的实施,这似乎是您的情况(我不知道网络个人资料正在提供{ {顺便说一下} {。}}。

确切地说,此工件不必是“第一”依赖项,但必须在<{strong> EJBContainer工件之前声明。< / p>

  

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

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

javaee-api
  

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

单元测试通常在容器外部进行,并且是隔离的(使用Mocking框架),因此我不会调用该单元测试。但是对于集成/功能测试(容器内),<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> API真的很棒,非常好。

另见