我一直在尝试设置我的应用程序,以便可以整天对它的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();
推荐的标准解决方案是将玻璃鱼嵌入的所有工件添加为具有测试范围的第一个项目依赖项
<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的问题。
那么,是否存在Nexus可以索引的Maven存储库,从而为我提供了嵌入了玻璃鱼的所有工件?我读过几篇文章提到,现在要使用的正确工件是javax.ejb,但是我再也找不到运气了。
您可能已经猜到我对单元测试是完全陌生的,而对于JEE6来说却是相当陌生的。这甚至是进行单元测试EJB的正确方法吗?
(…)推荐的标准解决方案是将包含玻璃鱼的所有工件添加为具有测试范围的第一个项目依赖项
确实,您需要一个类似的实现,glassfish-embedded-all或者glassfish-embedded- web如果您仅使用网络配置文件,这似乎是您的情况(我不知道网络配置文件是EJBContainer顺便提供的)。
glassfish-embedded-all
glassfish-embedded- web
EJBContainer
确切地说,此工件不必是“第一个”依赖项,但 必须 在 该javaee-api工件 之前 声明。
javaee-api
那么,是否存在Nexus可以索引的Maven存储库,从而为我提供了嵌入了玻璃鱼的所有工件?
我无法通过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框架),因此我不称其为单元测试。但是对于集成/功能测试(容器内),该EJBContainerAPI确实很棒而且非常完美。