1. 概述

在本教程中,我们将学习如何使用 Mockk 验证一个方法没有被调用。我们将介绍 Mockk 提供的两种主要方式来完成这个验证。

  1. 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() 方法被意外调用时抛出异常。这可以防止测试中误调用该方法。

  1. 使用 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,适合需要严格验证的场景。
❌ 缺点:略显啰嗦,特别是在测试逻辑较复杂时会增加阅读负担。

  1. 使用 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 明确,不适合需要精确控制调用次数的场景。

  1. 总结

我们介绍了使用 Mockk 验证方法未被调用的两种方式:

  • verify(exactly = 0) { ... }精确验证调用次数为 0
  • verify { mock wasNot Called }简洁断言 mock 未被调用

根据测试场景选择合适的方式,可以提升测试代码的可读性和可维护性。

完整示例代码请参考:GitHub 仓库


原始标题:Mockk – Check If a Method Was Not Invoked