Mockito 通过 verify() 配合 times(n)、never()、atLeastOnce() 等验证方法调用次数,需在被测代码执行后显式指定验证模式,参数匹配影响计数结果,错误 matcher 可致静默失败。

在 Mockito 中,验证方法被调用了多少次,主要用 verify() 配合 times(n)、never()、atLeastOnce()、atLeast(n)、atMost(n) 等验证器(VerificationMode)来实现。
使用 times(n) 精确验证调用次数
这是最常用的方式,用于断言某个方法**恰好被调用 n 次**。
示例:
Service service = mock(Service.class); service.doSomething(); service.doSomething(); verify(service, times(2)).doSomething(); // ✅ 通过 verify(service, times(1)).doSomething(); // ❌ 报错:实际调用 2 次,期望 1 次
其他常用调用次数验证方式
-
never():等价于times(0),确保方法一次都没被调用 -
atLeastOnce():至少调用 1 次(常用,避免硬编码具体次数) -
atLeast(2):至少调用 2 次 -
atMost(3):最多调用 3 次
注意验证顺序和范围
Mockito 默认只验证你在 verify() 之前执行的交互。如果在 verify() 后又调用了被测方法,它不会影响本次验证结果。
立即学习“Java免费学习笔记(深入)”;
另外,验证必须在被测代码执行完毕后进行;否则可能漏掉调用或误报。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
常见错误写法:
verify(mockObj).method(); // 没指定次数 → 默认 times(1) // 如果 method 实际被调用了 0 次或 2 次,都会失败
建议显式写出验证模式,提高可读性和意图明确性。
验证带参数的方法调用次数
参数匹配不影响次数验证逻辑,只需确保参数匹配成功即可计数:
list.add("a");
list.add("b");
list.add("c");
verify(list, times(2)).add(eq("a")); // ❌ 不通过:只 add("a") 了 1 次
verify(list, times(1)).add(anyString()); // ✅ 通过:add 任意字符串共 3 次?等等 —— 错!
⚠️ 注意:anyString() 匹配所有字符串,所以 add(anyString()) 会匹配全部 3 次调用,因此 times(1) 会失败。正确写法是:
verify(list, times(3)).add(anyString()); // ✅
不复杂但容易忽略的是:验证次数的前提是方法确实被 stub 或真实调用过,且参数匹配逻辑要写对。写错 matcher 可能导致验证“静默失败”(即没报错但其实没匹配上任何调用)。

















