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。
解决方案
- 调整代码执行顺序,所有调用
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); }
- 升级PowerMock版本到2.0.9及以上,修改pom.xml中的版本配置即可:
<properties> <powermock.version>2.0.9</powermock.version> </properties>
- 可选优化:替换静态方法打桩API为PowerMock原生API,避免框架适配问题:
PowerMockito.when(Locale.getISOCountries()).thenReturn(new String[]{});
内容的提问来源于stack exchange,提问作者user16979464
相关产品推荐
相关产品推荐

