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的断言,两者逻辑冲突,导致抛出断言错误。
正确写法
两种方式任选其一即可:
- 使用
verify(exactly = 0)(原写法,可正常工作):
verify(exactly = 1) { logger.info(logMessage) } verify(exactly = 0) { logger.error(any<String>()) }
- 使用
wasNot Called(无需verify包裹):
verify(exactly = 1) { logger.info(logMessage) } logger.error(any<String>()) wasNot Called
内容的提问来源于stack exchange,提问作者Balu
相关产品推荐
相关产品推荐

