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

MockK如何不执行原方法即可Mock方法调用并返回指定值

MockK 不执行原方法Stub方法调用的正确用法

你之前使用every { method } returns value会触发原方法执行,是因为这个API的语义和Mockito中when(mock.method()).thenReturn(value)完全一致:当你操作spyk()创建的间谍(部分模拟)对象时,大括号内的方法调用会真实执行原逻辑,和Mockito的行为表现完全相同。

MockK提供了和MockitodoReturn(x).when(y).method()语义完全对等的API,Stub过程中不会触发任何原方法逻辑,写法如下:

doReturn(预设返回值).whenever(模拟/间谍对象) {
    需要Mock的目标方法调用()
}

用法示例

比如要对间谍对象的方法做Stub,全程不执行原方法:

// 基于真实类创建间谍对象
val orderService = spyk(OrderService())

// Stub queryOrderStatus方法,传入参数1001时直接返回"PAID",不执行原方法逻辑
doReturn("PAID").whenever(orderService) {
    queryOrderStatus(1001L)
}

// 调用时直接返回预设值,不会走原方法的数据库查询等逻辑
val status = orderService.queryOrderStatus(1001L) // 输出PAID

补充说明

  • 注意区分whenever和普通every:every会先执行大括号内的方法调用再完成Stub,doReturn...whenever会直接替换方法的执行逻辑,不会触发原方法
  • 如果你使用mockk()创建的纯模拟对象,默认所有方法都是空实现,不存在执行原方法的问题,此时用every做Stub不会有你遇到的问题
  • 对应Mockito的doThrow语义,MockK也提供了doThrow(异常实例).whenever(对象) { 方法调用() }写法,同样不会触发原方法执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 11:21:26