添加@PrepareForTest仍触发ClassNotPreparedException问题求助
org.powermock.api.mockito.ClassNotPreparedException的常见原因 未配置PowerMock测试运行器/扩展
JUnit 4测试类必须添加@RunWith(PowerMockRunner.class),JUnit 5则需引入@ExtendWith(PowerMockExtension.class)并确保对应扩展依赖已配置。缺少运行器时,@PrepareForTest注解完全不会生效,PowerMock无法拦截目标类的加载流程。@PrepareForTest注解位置错误
若测试代码采用内部嵌套类编写,注解必须加到实际执行测试的内部类上,而非仅加在外部类。例如外部类加了注解,但内部测试类没加,PowerMock只会处理外部类标注的类,不会处理内部测试类用到的目标类。PowerMock与Mockito/JUnit版本不兼容
PowerMock对依赖版本要求严格:PowerMock 2.x需搭配Mockito 2.x-3.x、JUnit 4.12+或JUnit 5.5+;PowerMock 1.x仅支持Mockito 1.x。版本不匹配会导致@PrepareForTest的类预处理逻辑失效,直接触发类未准备的错误。目标静态类被提前加载
若测试类的静态代码块、成员变量初始化或@BeforeClass方法中,提前调用了IbanUtil的静态方法,PowerMock还未完成类拦截就会触发加载,导致报错。需将此类初始化逻辑移至@Before方法,或添加@SuppressStaticInitializationFor(IbanUtil.class)禁止目标类的静态初始化。误用Mockito原生
mockStaticAPI
若使用Mockito 3.4+原生的mockStatic而非PowerMock的PowerMockito.mockStatic,@PrepareForTest注解不会生效。必须使用PowerMock提供的API来mock静态类:PowerMockito.mockStatic(IbanUtil.class); when(IbanUtil.validate(anyString())).thenReturn(true);构建工具类加载器隔离问题
Maven或Gradle的测试类加载器隔离设置可能导致PowerMock无法替换目标类的加载。可尝试调整构建配置,比如在Maven的maven-surefire-plugin中添加:<configuration> <useSystemClassLoader>false</useSystemClassLoader> </configuration>
内容的提问来源于stack exchange,提问作者Berlin

