Mockk增加了对模拟全局函数的支持。
然而,当它们超载时,就会出现一个问题。
例如,如果试图使用delay()模拟mockkStatic(::delay),则会遇到以下错误:
Overload resolution ambiguity:
public suspend fun delay(timeMillis: Long): Unit defined in kotlinx.coroutines
public suspend fun delay(duration: Duration): Unit defined in kotlinx.coroutines是否有一种方法来模拟具有重载的全局函数?
发布于 2022-08-17 21:57:40
这个问题有点棘手,因为使用Kotlin反射访问这样一个全局函数的声明类似乎是不可能的。但是,如果您知道同一文件中至少有一个未重载的其他函数,则可以使用Java反射。
例如,假设您指的是协同服务的delay,在同一个文件中定义了函数awaitCancellation。
我们可以使用它来访问声明delay的Java类,并查询它以获得正确的delay实现。
val declaringClass = ::awaitCancellation.javaMethod!!.declaringClass
val methods = declaringClass.declaredMethods
val ref = methods.mapNotNull { it.kotlinFunction }
.filter { it.name == "delay" }
.first { it.parameters[0].type == Long::class.createType() }
mockkStatic(ref)在本例中,ref指向以Long作为参数的delay的实现。
对于另一个实现,我们需要在最后一个条件下用Long替换Duration。
https://stackoverflow.com/questions/73371982
复制相似问题