mockito.verify可验证多态方法调用次数,前提是方法在mock或spy对象上调用;它按方法签名匹配记录,与运行时类型无关,但不支持默认方法和final方法(需mockito-inline等扩展)。

Mockito.verify 可以验证多态方法的调用次数,关键在于:被验证的方法必须是 在 mock 对象上被调用的,且 Mockito 仅记录对 mock(或 spy)对象的调用,不追踪真实对象或父类/接口的默认实现。
确保目标方法由 mock 对象执行
多态本身不影响 verify —— Mockito 关注的是“哪个对象”响应了调用,而不是“哪个类定义了该方法”。只要调用发生在 mock 实例上,verify 就能捕获。
- 正确做法:mock 接口或父类,然后调用其多态方法(如
Animal animal = mock(Dog.class); animal.sound();),verify 能统计sound()调用次数 - 错误做法:用真实子类实例(
new Dog())调用方法,verify 无法拦截 —— 需改用spy(new Dog())才可验证(但注意 spy 默认会执行真实方法)
用 verify(..., times(n)) 显式指定次数
对多态方法调用,语法与普通方法一致。Mockito 根据方法签名(名称 + 参数类型)匹配调用记录,与运行时实际类型无关。
-
verify(mockAnimal, times(2)).sound();—— 验证sound()被调用了 2 次,无论 mock 是Dog、Cat还是Animal类型 - 若方法重载(如
process(String)和process(int)),需确保参数匹配,否则 verify 可能找不到对应调用
处理默认方法和 final 方法的限制
Java 8+ 接口默认方法、以及 final 方法(含 private 方法)不能被 Mockito mock,默认情况下 verify 无法拦截它们的调用(除非使用 mockito-inline + MockedStatic 等高级特性)。
- 接口默认方法:若 mock 接口并调用其 default 方法,Mockito 默认不会拦截(返回默认行为),verify 也无记录 —— 建议显式 stub:
when(mockInterface.defaultMethod()).thenReturn(...) - final 方法:标准 Mockito 不支持 mock,需启用 inline mock(添加
mockito-inline依赖),再用mock(FinalClass.class)才能 verify
避免常见陷阱
验证失败常因对象引用或调用链混淆导致,而非多态本身问题。
- 不要 verify 真实对象(如
new ArrayList())上的方法调用 —— 必须是 mock 或 spy - 确保 verify 在被测代码执行完毕后调用,且未被异常中断
- 若方法被多次调用但参数不同,而你只 verify 无参版本,可能漏匹配 —— 可用
argThat或any()放宽参数约束
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











