Mockito 3.4.0+ 支持 mockStatic 模拟静态方法,需 Java 16+(Mockito 4.11.0+)或 Java 8–15(加 -Dmockito.inline=true),必须用 try-with-resources 管理 MockedStatic 并调用 close(),支持 when/verify(5.0+)及 lambda 明确重载签名。

Mockito 从 3.4.0 版本开始支持 mockStatic,用于模拟静态方法——但要注意:它仅在 Java 16+(配合 Mockito 4.11.0+)或 Java 8–15(需额外配置)中可用,且必须在测试方法执行完毕后调用 close() 释放资源,否则可能影响后续测试。
启用 mockStatic 的前提条件
确保项目满足以下任一组合:
- Java 16 或更高版本 + Mockito 4.11.0+
- Java 8–15 + Mockito 4.11.0+ + 启用 JVM 参数:
-Dmockito.inline=true(推荐加到测试运行配置中) - Maven 依赖需包含
mockito-core(4.11.0+),无需额外模块
基本用法:模拟单个静态方法
使用 MockedStatic 包裹目标类,然后通过 when(...).thenReturn(...) 设置行为:
try (MockedStatic<Math> mocked = mockStatic(Math.class)) {
mocked.when(() -> Math.abs(-5)).thenReturn(10);
assertEquals(10, Math.abs(-5)); // 返回 10,不是 5
}
注意:mockStatic 返回的是 MockedStatic<t></t> 实例,必须用 try-with-resources 管理生命周期;作用域外调用原静态方法仍走真实逻辑。
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
模拟多个方法或带参数的静态方法
可在同一个 MockedStatic 块内多次调用 when,支持参数匹配器:
try (MockedStatic<LocalDateTime> mocked = mockStatic(LocalDateTime.class)) {
mocked.when(LocalDateTime::now).thenReturn(LocalDateTime.of(2020, 1, 1, 0, 0));
mocked.when(() -> LocalDateTime.parse("2020-01-01"))
.thenReturn(LocalDateTime.of(2020, 1, 1, 0, 0));
assertEquals("2020-01-01T00:00", LocalDateTime.now().toString());
assertEquals("2020-01-01T00:00", LocalDateTime.parse("2020-01-01").toString());
}
对重载方法,务必用 lambda 形式(如 () -> Xxx.method(...))明确指定签名;直接写 Xxx.method(...) 会导致编译错误或匹配失败。
验证静态方法是否被调用
Mockito 5.0+ 支持对静态调用进行 verify(Mockito 4.x 不支持):
try (MockedStatic<System> mocked = mockStatic(System.class)) {
mocked.when(() -> System.getProperty("os.name")).thenReturn("test-os");
String os = System.getProperty("os.name");
mocked.verify(() -> System.getProperty("os.name")); // ✅ 验证被调用一次
mocked.verify(() -> System.getProperty("os.name"), times(1)); // 等价写法
}
verify 必须在 MockedStatic 作用域内执行;不支持 verify 某个静态方法“未被调用”(即 never() 在静态场景下不可靠)。
不复杂但容易忽略资源释放和 JVM 配置。只要环境配对、用 try-with-resources 包裹、lambda 写清楚调用,静态方法就能稳稳 mock。

















