繁体   English   中英

在 Kotlin 中测试私有方法

[英]Testing a private method in Kotlin

我正在尝试测试一个将以下参数作为输入的私有方法:

待测类

delete(
        someId1: String,
        aList: List<CustomObject>,
        someId2: String,
        someId3: String,
        someId4: String
) : Long? {
}

测试类

val method = ClassToBeTested.javaClass.getDeclaredMethod("delete", String::class.java,
    List::class.java, String::class.java, String::class.java, String::class.java)
method.isAccessible = true
val testId = method.invoke(ClassToBeTested, someId1, aList, someId2, someId3, someId4)

我最终收到以下错误:

java.lang.NoSuchMethodException:

ClassToBeTested$Companion.delete(java.lang.String, java.util.Arrays$ArrayList, java.lang.String, java.lang.String, java.lang.String)

当我尝试将上述方法声明更改为:

val method = ClassToBeTested.javaClass.getDeclaredMethod("delete", String::class.java,
    List<CustomObject>::class.java, String::class.java, String::class.java, String::class.java)

我收到以下错误:
Kotlin: Only classes are allowed on the left hand side of a class literal

无论如何我们可以测试带有自定义对象列表参数的私有 function 吗?

您可以使用 Kotlin 的declaredMemberFunctions属性仅根据其名称来查找它:

data class CustomObject(val id: String)

class ClassToBeTested {
    private fun delete(
        someId1: String,
        aList: List<CustomObject>,
        someId2: String,
        someId3: String,
        someId4: String
    ): Long? {
        return someId1.toLongOrNull()
    }
}

class SampleTest {

    @Test
    fun test1() {
        val instance = ClassToBeTested()
        val method = instance::class.declaredMemberFunctions.first { it.name == "delete" }.apply { isAccessible = true }
        val result = method.call(instance, "1", emptyList<CustomObject>(), "2", "3", "4")
        assertEquals(1L, result)
    }
}

不要为此使用反射。 只需将方法internal方法并直接从您的测试中调用它。 您甚至可以添加@VisibleForTesting@TestOnly类的注释,这些在各种库中都可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM