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

Mockk问题:重复存根同一函数时首个行为被忽略

MockK存根匹配顺序导致的问题原因

你遇到的问题核心是MockK的存根匹配顺序规则,并非捕获行为直接覆盖所有逻辑:

  • MockK在匹配存根时,会按照every语句的定义逆序检查——最后定义的存根会被优先匹配。
  • 你写的第二个every语句里,capture(idSlot)是通用匹配器,它不做任何参数过滤,能匹配任何传入的id值。
  • 当调用findById(1234)时,MockK先检查第二个存根,发现参数符合capture的匹配条件(接受任何值),直接执行该存根的answers逻辑返回Product实例,不会再去检查第一个针对id >=100的存根。

简单来说,你把范围更宽泛的存根(匹配所有id)定义在了范围更具体的存根(匹配id>=100)之后,导致宽泛规则先被匹配,覆盖了前面的具体规则。

如果想保留两个存根的写法,只需调整顺序:先定义通用捕获存根,再定义针对id>=100的存根——这样id>=100时会优先匹配后定义的具体规则返回null,其他id则匹配通用规则返回Product实例:

every { repoMock.findById(capture(idSlot)) } answers { Product(idSlot.captured, "Sample Product", 1.99) }
every { repoMock.findById(more(100, true)) } returns null

当然你提到的用if判断的answers块也是更简洁的写法:

every { repoMock.findById(capture(idSlot)) } answers {
    val id = idSlot.captured
    if (id >= 100) null else Product(id, "Sample Product", 1.99)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:55:02