Java静态方法模拟必须使用mockito-inline的mockStatic,通过MockedStatic配合try-with-resources管理生命周期,并用lambda表达式指定被mock方法,参数需匹配或使用anyXxx()匹配器,verify也须用lambda语法。

Java 静态方法不能用常规的 mock() 模拟,必须使用 Mockito 提供的 mockStatic 机制,且依赖 mockito-inline 模块。核心要点是:启用字节码增强、用 MockedStatic 管理生命周期、用 lambda 表达式指定被 mock 的调用形式。
必须添加 mockito-inline 依赖
基础的 mockito-core 不支持静态方法模拟。你需要显式引入 mockito-inline(它已包含 mockito-core):
- Maven 中添加(以 5.12.0 为例):
- 注意版本一致性:若同时声明
mockito-core,必须与inline版本完全相同,否则会触发类加载冲突或MockitoException。
用 try-with-resources 管理 MockedStatic
MockedStatic 是一个可关闭资源,必须在作用域内使用,否则 mock 会泄漏到其他测试中,导致干扰或失败:
- 正确写法(推荐):
mocked.when(() -> EmailUtil.sendEmail("a@b.com", "hi", "body"))
.thenReturn(true);
// 执行被测代码
assertTrue(emailService.sendEmail("a@b.com", "hi", "body"));
}
- 不加
try或忘记关闭,会导致后续测试中该静态方法仍被 mock,行为不可控。
模拟有参/无参静态方法的写法区别
所有静态方法 mock 都必须用 lambda 形式 () -> Class.method(...),不能直接写 Class.method(...):
立即学习“Java免费学习笔记(深入)”;
- 无参方法:
- 有参方法(参数需匹配,可用
anyString()等 matcher):
.thenReturn(new Date());
- 若参数类型不匹配或未用
anyXxx()却传了具体值,when将不生效,调用仍走真实逻辑。
验证静态方法是否被调用
和普通 mock 类似,但 verify 也必须用 lambda 语法:
- 验证调用次数:
- 验证是否至少调用一次(忽略参数):
- 注意:
verify只能用于已通过when声明过的方法;否则抛出UnfinishedVerificationException。


















