Mockito.verify()仅能验证mock或spy对象的方法调用,对普通实例无效;需在被测逻辑执行后调用,支持times(N)、never()等次数校验,参数需严格匹配或使用anyString()等宽松匹配。

直接用 Mockito.verify() 就能验证方法是否被调用、调用了几次,关键是要确保目标方法确实发生在 mock 或 spy 对象上,而不是真实对象。
必须用 mock 或 spy 对象
verify 只能检查对 mock(或 spy)对象的调用记录,对 new 出来的普通实例无效。
- ✅ 正确:用
mock(List.class)创建模拟对象,再调用list.add("x"),之后verify(list).add("x")才有效 - ❌ 错误:直接
new ArrayList(),然后verify(list).add("x")—— 这会报 “wanted but not invoked”,因为真实对象的调用不会被 Mockito 拦截 - ⚠️ spy 是例外:可用
spy(new ArrayList())验证真实对象的方法调用,但注意它默认会执行原逻辑,可能产生副作用
验证调用次数的基本写法
语法统一为:verify(mock, times(N)).methodName(args)。times 是最常用也最直观的计数方式。
-
verify(mock, times(1)).doSomething()—— 必须恰好调用 1 次 -
verify(mock, times(0)).doSomething()—— 确保完全没调用(常用于否定路径测试) -
verify(mock, atLeast(2)).doSomething()—— 至少 2 次 -
verify(mock, never()).doSomething()—— 等价于times(0)
参数匹配要严格对应
Mockito 按方法签名 + 实际传参做匹配,参数不一致会导致 verify 失败,即使方法名和次数都对。
立即学习“Java免费学习笔记(深入)”;
- 如果被测代码调用的是
service.process("abc"),而你写verify(mock).process("def"),就会失败 - 放宽匹配可用
anyString()、eq("abc")或argThat(x -> x.length() > 3) - 重载方法(如
save(String)和save(int))必须保证参数类型和值都匹配,否则无法定位到正确调用
常见陷阱与绕过限制
不是所有方法都能被 verify,尤其涉及语言特性时需额外处理。
- 接口默认方法、final 方法默认不能被 mock —— 需引入
mockito-inline依赖,并启用 inline mock 支持 - 静态方法无法用常规 verify,要用
MockedStatic包裹 - verify 必须放在被测逻辑执行完毕后、断言之前;若中间抛异常未捕获,verify 不会执行
- 不要在同一个 mock 上反复 verify 同一方法却用不同参数,容易因匹配失败误判


















