你如何Mockk Kotlin顶级功能?

Nie*_*Wet 9 kotlin mockk

Mockk允许模拟静态函数,但是如何模拟Kotlin顶级函数?

例如,如果我调用了Kotlin文件HelloWorld.kt,我该如何模拟该sayHello()函数?


HelloWorld.kt

fun sayHello() = "Hello Kotlin!"
Run Code Online (Sandbox Code Playgroud)

小智 13

有一种方法可以模拟顶级函数:

mockkStatic("pkg.FileKt")
every { fun() } returns 5
Run Code Online (Sandbox Code Playgroud)

您只需要知道此功能转到哪个文件即可。检入JAR或堆栈跟踪。


gma*_*zzo 12

以下语法对我有用。

mockkStatic(::sayHello.javaMethod!!.declaringClass.kotlin)
Run Code Online (Sandbox Code Playgroud)

我很惊讶目前jvm-stdlib还没有关于此的任何内容。

编辑: 此重载现已正式引入:https : //github.com/mockk/mockk/pull/518

mockkStatic(::sayHello)
Run Code Online (Sandbox Code Playgroud)

  • 这绝对是最好的答案,因为它不依赖于硬编码的包路径字符串,如果不正确重构,硬编码的包路径字符串可能会损坏。这是保证您在编译时模拟正确方法的最简单方法。 (3认同)

小智 6

要添加以前的答案,这是有效的:

mockkStatic("pkg.FileKt")
every { fun() } returns 5
Run Code Online (Sandbox Code Playgroud)

其中mockStatic将“package_name:class_file_name”作为参数,但为了简化mockStatick调用,您可以直接在文件中使用@file:JvmName为编译器指定文件名。

HelloWorld.kt

@file:JvmName("hello")
fun sayHello() = "Hello Kotlin!"
Run Code Online (Sandbox Code Playgroud)

HelloWorldTest.kt

mockkStatic("pkg.hello")
every { fun() } returns 5
Run Code Online (Sandbox Code Playgroud)

关于为什么这是必要的以及其他示例的更详细说明:https://blog.kotlin-academy.com/mocking-is-not-rocket-science-mockk-advanced-features-42277e5983b5