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

如何使用Mockk匹配带泛型参数的Kotlin重载函数

解决方案

你可以直接使用Mockk提供的内联版本ofType<T>()方法匹配带泛型的参数类型,不需要传入Class对象,编译期会自动完成泛型类型的匹配校验,规避JVM泛型擦除导致的无法取带泛型Class的问题。

你之前尝试ofType(List<Performance>::class)报错的原因是JVM存在泛型擦除,带泛型参数的类无法直接通过::class语法获取对应的Class对象,而内联版本的ofType<T>()利用Kotlin的实化类型参数特性,在编译期就完成了类型的匹配判断,不需要在运行时获取泛型类型信息。

问号处的正确写法如下:

ofType<List<Performance>>()

完整的两个重载mock代码示例:

val scorer: Scorer = mockk()
//  mock单个Performance参数的重载,返回Double
every { scorer.score(ofType<Performance>()) } returns 0.9
//  mock List<Performance>参数的重载,返回DoubleArray
every { scorer.score(ofType<List<Performance>>()) } returns doubleArrayOf(0.9)

如果遇到编译器依然无法正确推断重载的情况,可以显式指定Stub的返回类型强制匹配对应重载:

every { scorer.score(any()) } as MockKStubScope<DoubleArray, DoubleArray> returns doubleArrayOf(0.9)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:51:00