Mockk:使用重载模拟全局函数

问题描述 投票:0回答:2

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

有没有办法模拟具有重载的全局函数?

unit-testing kotlin mockk
2个回答
4
投票

这个有点棘手,因为使用 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
指向以
delay
作为参数的
Long
的实现。

对于其他实现,我们需要将最后一个条件中的

Long
替换为
Duration


0
投票

您可以在同一文件中的另一个函数上调用

mockStatic
,它会模拟整个文件。例如
mockkStatic(::awaitCancellation)

医生:

在 jvm 环境中,您可以将类名替换为函数引用:

mockkStatic(Obj::extensionFunc)

请注意,这将模拟整个 pkg.FileKt 类,而不仅仅是 extensionFunc。

您还可以使用完整的类名字符串,例如

mockkStatic("kotlin.io.FilesKt__UtilsKt")

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.