mockito.verify()验证方法调用需满足:仅对mock/spy对象有效;必须在被测逻辑执行后调用;参数需精确匹配(推荐eq());次数校验用times(1)/never()/atleast(2)等。

用 Mockito.verify() 就能验证方法是否被调用,但必须满足几个关键前提,否则会报错或验证失败。
verify 只对 mock 或 spy 对象有效
你只能验证被 Mockito 管理的对象(@Mock 创建的 mock,或 @Spy 包裹的真实对象)上的方法调用。对 new XXX() 创建的普通实例调用 verify() 会直接失败,提示 “wanted but not invoked”。
- ✅ 正确:用
mock(List.class)创建模拟对象,再调用list.add("x"),之后verify(list).add("x") - ❌ 错误:直接
new ArrayList(),然后verify(list).add("x")—— 真实对象的调用不会被记录 - ⚠️ 注意 spy:可用
spy(new ArrayList())验证真实对象调用,但它默认执行原逻辑,可能引发副作用(如 IO、数据库操作)
调用时机必须在被测逻辑执行之后
verify() 要放在被测方法执行完毕、且未抛出未捕获异常的位置。如果测试中中途抛了异常,verify() 就不会运行,导致验证被跳过。
- 确保
when(...).thenReturn(...)和实际执行(如service.doSomething())已完成 - 验证语句写在
when和执行之后、断言之前 - 若需验证异常路径,用
assertThrows包住执行,再做verify
参数匹配要准确,否则验证失败
Mockito 按方法签名 + 实际传参严格匹配。哪怕只差一个字符,verify(mock).process("abc") 也匹配不上 process("abC")。
- 推荐用
eq("abc")替代"abc",语义更清晰,避免因重载或自动装箱出错 - 宽松匹配可用
anyString()、any(Class.class)或argThat(x -> x.contains("test")) - 重载方法(如
save(String)和save(int))必须保证类型和值都一致,否则无法定位到正确调用
验证调用次数的常用写法
次数校验通过 verify(mock, times(N)) 等方式表达,最常用的是 times(1)、never() 和 atLeast(2)。
-
verify(mock, times(1)).doWork()—— 必须恰好调用 1 次 -
verify(mock, never()).doWork()—— 等价于times(0),确保完全没调用 -
verify(mock, atLeast(2)).doWork()—— 至少调用 2 次 -
verify(mock, timeout(500)).doWork()—— 在 500ms 内完成调用(适用于异步场景,需配合同步执行器)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











