You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:13:06