mockito.verify() 配合 times(n) 仅对 mock/spy 对象有效,普通实例无效;spy 可验证真实对象调用但会执行原逻辑;参数匹配需精准,集合中多个对象须各自独立 mock。

用 Mockito.verify() 配合 times(N) 就能准确验证方法被调用了几次,但必须作用在 mock 或 spy 对象上,对普通 new 出来的实例无效。
确保目标是 mock 或 spy 对象
只有 Mockito 能记录 mock/spy 上的方法调用。真实对象的调用不会被拦截,verify 会直接失败。
- ✅ 正确:用
mock(List.class)创建模拟对象,再调用list.add("x"),之后verify(list, times(1)).add("x") - ❌ 错误:直接
new ArrayList(),然后对它调用verify(list).add("x")—— 报错 “wanted but not invoked” - ⚠️ spy 是特例:
spy(new ArrayList())可验证真实对象调用,但原方法逻辑仍会执行,注意副作用
写清楚次数,别依赖默认值
verify(mock).method() 默认等价于 times(1),但实际调用 0 次或 2 次都会失败。显式写出次数更安全、意图更清晰。
-
verify(mock, times(1)).doWork()—— 必须恰好 1 次 -
verify(mock, never()).doWork()—— 等价于times(0),确保完全没调用 -
verify(mock, atLeast(2)).doWork()—— 至少 2 次
参数匹配要精准,宽松匹配需留意计数逻辑
verify 按方法签名 + 实际传参做匹配,参数不一致就无法计入次数。
- 被测代码调了
service.process("abc"),你写verify(mock).process("def")→ 失败 - 用
anyString()匹配所有字符串,所以verify(mock, times(1)).add(anyString())要求“只匹配到 1 次调用”,如果实际调了 3 次,就会失败 - 想验证“add 任意字符串共 3 次”,应写
verify(mock, times(3)).add(anyString())
集合中多个对象要各自独立 mock
若被测逻辑遍历 Set 并对每个元素调用方法,不能复用同一个 mock 实例加进 Set —— HashSet 会去重,导致实际只验证了一个。
- ✅ 正确:为每个元素创建独立 mock:
bSet.add(mock(B.class)); bSet.add(mock(B.class)) - 然后循环验证:
for (B b : bSet) { verify(b).bMethod(); } - ❌ 错误:
B mockB = mock(B.class); bSet.add(mockB); bSet.add(mockB);→ Set 中只剩一个元素
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











