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
相关产品推荐
相关产品推荐

