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

Java11+JUnit4.13.1运行PowerMock出现Unexpected异常及Mockito误用错误

问题原因
  • 执行顺序错误:你在调用PowerMockito.mockStatic(Locale.class)完成静态类mock之前,先执行了String countryCodeUpper = countryCode.toUpperCase(Locale.ENGLISH);,提前加载了未被PowerMock修改字节码的Locale原始类,导致后续mock静态类操作失效,Mockito识别到Locale不是有效mock对象,抛出NotAMockException。
  • 版本适配问题:你当前使用的PowerMock 2.0.2版本对Java 11、JUnit 4.13.1的兼容性存在缺陷,也是导致静态mock失效的诱因之一。
  • 打桩API适配问题:直接用BDDMockito给PowerMock生成的静态mock打桩存在兼容性风险,建议用PowerMock自带的打桩API。
解决方案
  1. 调整代码执行顺序,所有调用Locale类的逻辑必须放在静态mock操作之后,修改后的测试方法示例:
@Test(expected = EntityNotFoundException.class)
public void test_PowerMock() {
    // 先完成静态类mock,再调用任何Locale相关逻辑
    PowerMockito.mockStatic(Locale.class);
    BDDMockito.given(Locale.getISOCountries()).willReturn(new String[]{});

    String countryCodeUpper = countryCode.toUpperCase(Locale.ENGLISH);
    demoService.create(countryCode);
}
  1. 升级PowerMock版本到2.0.9及以上,修改pom.xml中的版本配置即可:
<properties>
    <powermock.version>2.0.9</powermock.version>
</properties>
  1. 可选优化:替换静态方法打桩API为PowerMock原生API,避免框架适配问题:
PowerMockito.when(Locale.getISOCountries()).thenReturn(new String[]{});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:54:04