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
}</math>
注意:mockStatic 返回的是 MockedStatic 实例,必须用 try-with-resources 管理生命周期;作用域外调用原静态方法仍走真实逻辑。
模拟多个方法或带参数的静态方法
可在同一个 MockedStatic 块内多次调用 when,支持参数匹配器:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
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());
}</localdatetime>
对重载方法,务必用 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)); // 等价写法
}</system>
verify 必须在 MockedStatic 作用域内执行;不支持 verify 某个静态方法“未被调用”(即 never() 在静态场景下不可靠)。
不复杂但容易忽略资源释放和 JVM 配置。只要环境配对、用 try-with-resources 包裹、lambda 写清楚调用,静态方法就能稳稳 mock。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










