使用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
相关产品推荐
相关产品推荐

