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

