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

使用PowerMockRunner运行JUnit测试时调用List.of()抛出IncompatibleClassChangeError

问题解决方法

错误原因

List.of()是Java 9引入的接口静态方法,旧版本PowerMock的字节码处理逻辑不支持Java 9新增的InterfaceMethodref常量类型,导致JVM检测到方法引用类型不兼容,抛出IncompatibleClassChangeError。

解决办法

  • 升级PowerMock版本
    使用PowerMock 2.0及以上版本,该版本已适配Java 9+的接口静态方法字节码格式。以Maven依赖为例:

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>2.0.9</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito2</artifactId>
        <version>2.0.9</version>
        <scope>test</scope>
    </dependency>
    
  • 移除PowerMockRunner(若无需PowerMock特性)
    如果测试不需要mock静态方法、私有方法等PowerMock专属功能,直接替换为MockitoJUnitRunner(或JUnit 5的@ExtendWith(MockitoExtension.class)),即可正常运行测试。

  • 配置PowerMock忽略java.util.List的字节码修改
    若必须使用PowerMock,可通过@PowerMockIgnore注解让PowerMock不对java.util.List类进行字节码操作,避免干扰List.of()的执行:

    @RunWith(PowerMockRunner.class)
    @PowerMockIgnore("java.util.List")
    public class ListOfTest {
    
      @Test
      public void test() {
        assertTrue(List.of(1, 2).size() == 2);
      }
    }
    

    若有其他java.util包下的类也出现类似问题,可改为@PowerMockIgnore("java.util.*"),但建议尽量精确指定忽略范围,避免影响其他需要mock的类。

内容的提问来源于stack exchange,提问作者Pramod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:54:14