verify是mockito中验证方法调用次数与参数的核心工具,需在被测代码执行后使用times(n)、never()等匹配器显式指定次数,如verify(mock, times(2)).method()。

在 Mockito 中,verify 是用于验证**某个方法是否被调用、调用多少次、以什么参数调用**的核心工具。要验证调用次数,关键在于配合 times(n)、atLeastOnce()、never() 等匹配器使用。
基础语法:verify(mock).method()
必须先用 Mockito.mock() 创建模拟对象,再对其方法调用进行验证。验证本身不执行逻辑,只检查记录的调用行为。
- 默认情况下,
verify(mock).doSomething()表示“至少调用 1 次”(等价于verify(mock, times(1)).doSomething()) - 想明确断言调用次数,必须显式传入验证模式,比如
times(3) - 验证必须放在被测代码执行之后,否则没有调用记录可查
常用调用次数验证方式
所有次数匹配器都来自 org.mockito.Mockito,无需额外导入(静态导入后可直接用):
-
times(5):精确验证调用了 5 次 -
atLeastOnce():至少 1 次(含 1 次及以上) -
atLeast(2):至少 2 次 -
atMost(3):最多 3 次 -
never():确认从未被调用(等价于times(0))
完整示例(含常见错误提醒)
假设有一个服务类依赖 UserService,我们要验证它是否调用了 saveUser() 两次:
UserService mockUserSvc = mock(UserService.class); UserManager userManager = new UserManager(mockUserSvc); userManager.processUsers(Arrays.asList(new User(), new User())); verify(mockUserSvc, times(2)).saveUser(any(User.class)); // ✅ 正确:指定次数 + 参数匹配
注意:如果写成 verify(mockUserSvc).saveUser(any()),它只校验是否调用过,不校验次数;若实际调用了 3 次,这个验证仍会通过 —— 这不是 bug,是设计如此。
进阶技巧:验证顺序与多次不同参数调用
需要严格按顺序验证多个调用,用 inOrder():
InOrder inOrder = inOrder(mockDao); inOrder.verify(mockDao).insert(any()); // 第一次 inOrder.verify(mockDao).update(any()); // 第二次
若需分别验证不同参数的调用次数,可多次 verify 并搭配 argThat() 或具体值匹配:
verify(service, times(1)).handle("ERROR")verify(service, times(2)).handle("INFO")
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











