You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin测试中MockK的verify(exactly=0)与wasNot called有何区别?

MockK中verify(exactly = 0)与wasNot Called的差异及问题解决

核心差异

两者都是用来断言Mock对象的方法未被调用,但在语法、语义和使用场景上有明显区别:

  • 语法与调用方式
    • verify(exactly = 0) { ... }:必须包裹在verify块中,属于次数验证的变体,通过指定exactly=0明确断言块内的方法调用次数为0。
    • wasNot Called:直接附加在Mock方法调用后,属于状态验证,无需包裹在verify块中,直接断言该特定方法调用(含参数匹配逻辑)从未发生。
  • 语义侧重点
    • verify(exactly=0)更关注调用次数的精确性,适合需要明确次数约束的场景。
    • wasNot Called更关注调用行为的“不存在性”,语义上更直白地表达“这个调用根本没发生过”。

你的报错原因及解决

你遇到的报错是因为语法使用错误:wasNot Called不能放在verify块内部。

当你写verify { logger.error(any<String>()) wasNot Called }时,MockK会先尝试验证logger.error(any<String>())这个调用是否存在,同时又附加wasNot Called的断言,两者逻辑冲突,导致抛出断言错误。

正确写法

两种方式任选其一即可:

  1. 使用verify(exactly = 0)(原写法,可正常工作):
verify(exactly = 1) { logger.info(logMessage) }
verify(exactly = 0) { logger.error(any<String>()) }
  1. 使用wasNot Called(无需verify包裹):
verify(exactly = 1) { logger.info(logMessage) }
logger.error(any<String>()) wasNot Called

内容的提问来源于stack exchange,提问作者Balu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:15:48