JUnit测试EJB类遇ClassFormatError:Absent Code attribute问题求助
解决JUnit测试EJB时的
java.lang.ClassFormatError问题 这个问题我之前帮同事排查过,本质是你引入的依赖包只包含接口定义,没有实际的方法实现代码,导致测试时JVM加载类出错。咱们一步步来解决:
错误原因
你添加的两个javaee-api依赖(不管是javax的还是apache openejb的)都是仅包含接口、注解的空骨架包,里面的类比如EJBTransactionRolledbackException只有类结构,没有实际的方法代码。当JUnit测试时需要实例化这些类,JVM就会抛出Absent Code attribute的错误。
解决方案
1. 移除无效的依赖
先把这两个javaee-api依赖都删掉,它们对测试没有帮助反而添乱:
<!-- 删掉这两个依赖 --> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.openejb</groupId> <artifactId>javaee-api</artifactId> <version>6.0-6</version> <scope>test</scope> </dependency>
2. 引入OpenEJB的实际实现依赖
我们需要的是OpenEJB提供的包含完整代码的测试依赖,替换成下面的内容(版本可以根据你的Java EE版本调整,Java EE 6对应OpenEJB 4.x系列):
<dependency> <groupId>org.apache.openejb</groupId> <artifactId>openejb-core</artifactId> <version>4.7.5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.openejb</groupId> <artifactId>openejb-junit</artifactId> <version>4.7.5</version> <scope>test</scope> </dependency>
这些包包含了EJB相关类的完整实现,测试时JVM能正常加载类并执行代码。
3. 调整测试类的容器启动配置(可选但推荐)
如果你的测试需要启动嵌入式EJB容器,记得在测试类上添加OpenEJB的Runner注解,这样测试时会自动启动容器并注入EJB:
import org.junit.Test; import org.junit.runner.RunWith; import org.apache.openejb.junit.OpenEjbRunner; import javax.ejb.EJB; @RunWith(OpenEjbRunner.class) public class YourEJBTest { // 注入你要测试的EJB @EJB private YourEjbInterface yourEjb; @Test public void testEjbBusinessMethod() { // 编写你的测试逻辑 String result = yourEjb.someBusinessMethod(); // 断言验证结果 } }
4. 版本匹配注意事项
- 如果你用的是Java EE 6,就选OpenEJB 4.x版本;如果是Java EE 7,对应OpenEJB 5.x版本,避免版本不兼容问题。
内容的提问来源于stack exchange,提问作者Mina Salari
相关产品推荐
相关产品推荐

