gpt4 book ai didi

unit-testing - 使用 PowerMock 在 Kotlin 中模拟包级函数

转载 作者:IT老高 更新时间:2023-10-28 13:45:30 27 4
gpt4 key购买 nike

我在 Kotlin 中有一个包含一些包级函数的文件。

//Logger.kt

fun info(tag : String, message : String){
...
}

fun error{....}

我正在测试一个调用这个 kotlin 文件函数的类的函数,我想模拟它们。我知道包级函数就像Java中的静态方法,所以我一直在考虑使用PowerMock。

//MyClass: Class that calls Logger.kt functions
class MyClass {

fun myFunction(){
info("TAG", "Hello world!")
}

}

有什么想法吗?

最佳答案

您可以使用一种解决方法来模拟 Kotlin 的顶级函数。

说明

@PrepareForTest注释确实有 2 个参数来提供您要在其中模拟某些东西或在哪里模拟要使用的东西的上下文(类)。

第一个参数是 value如果输入 Class<?>[] :在这里你可以提供一个类数组。例如:

@PrepareForTest(Class1::class, Class2::class, Class3::class, QueryFactory::class)

第二个参数fullyQualifiedNames类型 String[] :在这里,您可以提供具有类的完全限定名称的数组。例如:

@PrepareForTest(Class1::class, fullyQualifiedNames = arrayOf("x.y.z.ClassName"))

假设我们有一个名为“MyUtils.kt”的 Kotlin 文件,它只包含顶级函数。如您所知,您不能从 Kotlin 文件中引用 MyUtilsKt 类,但可以从 Java 中引用。这意味着生成了静态类(我还没有足够的知识来为您提供有关此的更多详细信息)并且它具有完全限定的名称。

解决方案

这个解决方案并不完美。我在我们的代码库上实现了它,它似乎工作。当然可以改进。

  1. 我创建了一个名为 TopLevelFunctionClass.kt 的 Kotlin 文件我在其中添加了仅包含顶级函数的“类”的完全限定名称。

internal const val MyUtilsKt = "com.x.y.z.MyUtilsKt"

不幸的是,我不得不硬编码名称,因为注释参数必须是编译时常量。

  1. 我更新了 @PrepareForTest我的测试类的注释如下:

    @RunWith(PowerMockRunner::class)
    @PrepareForTest(Class1::class, Class2::class, Class4::class,
    fullyQualifiedNames = [MyUtilsKt]) // the string constant declared in TopLevelFunctionClass.kt
  2. 我更新了测试方法如下:

    MyUtils.kt 中的顶级函数:

    internal fun testMock(): Int {
    return 4
    }

    测试方法:

    @Test
    fun myTestMethod() {
    ...
    mockStatic(Class.forName(MyUtilsKt)) // the string constant declared in TopLevelFunctionClass.kt
    `when`(testMock()).thenReturn(10)
    assertEquals(10, testMock()) // the test will successfully pass.
    }

副作用:如果您重命名包含顶级函数的 kotlin 文件,您还必须更改 TopLevelFunctionClass.kt 中定义的常量.避免重命名问题的可能解决方案是添加:@file:JvmName("The name you want for this file") .如果您有 2 个同名文件,则会出现重复 JVM 类名错误。

关于unit-testing - 使用 PowerMock 在 Kotlin 中模拟包级函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49317264/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com