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

如何用Mockk模拟返回值类的Kotlin函数类型?

问题描述

我有一个在构造函数中接收函数类型的测试目标类:

class PricedStockListLoader(
    val stock: Stock,
    val pricing: (Item) -> Price?
)

在测试中我可以模拟这两个依赖:

val stock: Stock = mockk()
val pricing: (Item) -> Price? = mockk()
val loader = PricedStockListLoader(stock, pricing)

并且可以为stock指定预期行为:

every { stock.stockList(sameDayAsLastModified) } returns Success(stockList)

但当我尝试为pricing指定预期行为时:

every { pricing.invoke(anItem) } returns Price(666)

该行代码始终无法返回,卡在JUnit内部的Object.wait处。请问能否模拟返回值类的Kotlin函数类型?

解决方案

可以模拟Kotlin函数类型,但Mockk对函数类型的Stubbing有特殊要求,不能直接通过invoke方法设置预期行为,应该直接使用函数调用的语法:

// 匹配特定Item实例
every { pricing(anItem) } returns Price(666)

// 匹配任意Item实例(用any()匹配器)
every { pricing(any()) } returns Price(666)

Mockk针对Kotlin函数类型的mock是拦截函数调用语法的,直接调用invoke方法会绕过Mockk的拦截逻辑,导致测试陷入等待状态。另外,建议确保使用最新版本的Mockk,旧版本可能在函数类型支持上存在缺陷。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:41:35