mockito 4.11+ 原生支持 mockstatic(),需引入 mockito-inline(非 mockito-core),同测类内静态方法 mock 必须启用 calls_real_methods,jdk 17+ 可能需添加 -djdk.attach.allowattachself=true 参数。

Java 单元测试中 Mock 静态方法,目前无需额外“插件”,而是依赖 Mockito 官方内置的 mockStatic() 能力——它已稳定集成在 Mockito 4.11+(含 5.x) 中,且不再需要 PowerMock 或独立插件。关键在于正确引入依赖、启用字节码增强、并用对语法。
必须引入 mockito-inline
mockito-core 本身不支持静态方法 Mock。你得显式添加 mockito-inline(它已包含 core,且自带 ByteBuddy 字节码操作能力):
- Maven 依赖(以 Mockito 5.12.0 为例):
```
- ⚠️ 切勿同时引入
mockito-core和mockito-inline,版本不一致会引发NoClassDefFoundError或MockitoException。
正确写法:CALLS_REAL_METHODS 是核心
当被测方法和待 Mock 方法在同一个类里(如 Utils.doWork() 内部调用 Utils.getConfig()),必须启用 Answers.CALLS_REAL_METHODS,否则目标方法本身也被拦截,返回 null 或抛异常:
import static org.mockito.Answers.CALLS_REAL_METHODS;
import static org.mockito.Mockito.mockStatic;
import org.mockito.MockedStatic;
@Test
void testDoWork() {
try (MockedStatic
mocked.when(Utils::getConfig).thenReturn("test-value"); // 只 stub 这个
String result = Utils.doWork(); // ← 真实执行 doWork()
assertEquals("expected", result);
}
}
```
-
try-with-resources自动关闭 Mock,作用域严格限定在当前测试块内 - 未被
when(...)拦截的方法(如doWork)仍走原始逻辑 - 不加
CALLS_REAL_METHODS→doWork()不执行,测试失效
注意 JVM 启动参数(仅限某些 JDK 版本)
在 JDK 17+(尤其是非 LTS 或自定义构建版)上,若遇到 java.lang.SecurityException: Prohibited package name 或字节码增强失败,需添加 JVM 参数启用动态代理:
-Djdk.attach.allowAttachSelf=true -Dfile.encoding=UTF-8
```
- 多数现代 IDE(IntelliJ IDEA 2023.3+、Eclipse 2023-09+)默认已适配,通常无需手动加
- CI 环境(如 GitHub Actions)若报错,可在
mvn test命令前加上该参数
不推荐的旧方式(请绕行)
以下方案已过时或高风险,新项目应避免:
- PowerMock + Mockito:已停止维护,与 JDK 17+ 兼容性差,容易引发 ClassLoader 冲突
- @PrepareForTest:来自 PowerMock 的注解,Mockito 原生不识别
-
mockito-core 单独使用:无法 Mock 静态方法,会直接抛
UnsupportedOperationException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











