概述
在本教程中,我们将学习如何使用 Mockk 验证一个方法没有被调用。我们将介绍 Mockk 提供的两种主要方式来完成这个验证。
Mock 对象的准备
为了演示,我们先创建一个 Runnable
的 mock 对象:
@Test
fun `Verify a mock was not called`() {
val myMock: Runnable = mockk()
every { myMock.run() } answers { throw RuntimeException() }
}
上面代码中我们创建了一个 Runnable
的 mock,并通过 every { ... } answers { ... }
语法定义了当 run()
方法被意外调用时抛出异常。这可以防止测试中误调用该方法。
使用
verify(exactly = 0)
进行验证
最精确的方式是使用 verify
并指定 exactly = 0
,表示我们期望该方法被调用 0 次。
示例代码如下:
@Test
fun `Verify a mock was not called`() {
val myMock: Runnable = mockk()
every { myMyck.run() } answers { throw RuntimeException() }
verify(exactly = 0) { myMock.run() }
}
✅ 优点:明确表达期望调用次数为 0,适合需要严格验证的场景。
❌ 缺点:略显啰嗦,特别是在测试逻辑较复杂时会增加阅读负担。
使用
verify { mock wasNot Called }
简化验证
如果我们不关心具体调用次数,只是想验证某个 mock 完全没有被调用,Mockk 提供了更简洁的语法:
@Test
fun `Verify a mock was not called`() {
val myMock: Runnable = mockk()
every { myMock.run() } answers { throw RuntimeException() }
verify { myMock wasNot Called }
}
⚠️ 注意:wasNot
后面的 Called
可以写成小写 called
,效果一样。
✅ 优点:语法更简洁,适合快速断言 mock 没有被使用。
❌ 缺点:不如 exactly = 0
明确,不适合需要精确控制调用次数的场景。
总结
我们介绍了使用 Mockk 验证方法未被调用的两种方式:
- ✅
verify(exactly = 0) { ... }
:精确验证调用次数为 0 - ✅
verify { mock wasNot Called }
:简洁断言 mock 未被调用
根据测试场景选择合适的方式,可以提升测试代码的可读性和可维护性。
完整示例代码请参考:GitHub 仓库