我在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嵌入的所有神器?我读到的几个帖子提到,正在使用的正确的工件是javax.ejb,但是我没有找到这个了.
解决方法
(…) The standard recommended solution is to add the glassfish-embedded-all artifact as the first project dependency with test scope
事实上,如果您只使用网络配置文件(这似乎是您的情况),则需要像glassfish-embedded-all或glassfish-embedded-web这样的实现(我不知道Web配置文件是通过这种方式提供EJBContainer ).
而且准确地说,这个工件不一定是“第一”依赖,而是必须在javaee-api工件之前声明.
So,is there a Maven repository that Nexus will be able to index to give me the glassfish-embedded-all artifact?
我无法重现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>
is this even the correct way to go about unit testing EJBs?
单元测试通常在容器外部进行隔离(使用Mocking框架),因此我不会调用单元测试.但是对于集成/功能测试(集装箱)来说,EJBContainer API真的很棒,完美无缺.
也可以看看
> TOTD #128: EJBContainer.createEJBContainer: Embedded EJB using GlassFish v3
> Unit Testing EJBs and JPA with Embeddable GlassFish
> Using the EJBContainer API with or without Maven (but with GlassFish v3)
> Embedding EJB 3.1 Container Into Your Unit Tests – Boot Time: 5 Seconds
> Unit Testing EJB 3.1 …When 0.8 Seconds Are Too Long进行单元测试
> Arquillian项目