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

