mockito 在Kotlin中测试私有方法

cgyqldqp  于 2023-02-04  发布在  Kotlin
关注(0)|答案(2)|浏览(244)

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

    • 待测试类**
delete(
        someId1: String,
        aList: List<CustomObject>,
        someId2: String,
        someId3: String,
        someId4: String
) : Long? {
}
    • 测试类**

x一个一个一个一个x一个一个二个x
我最终得到下面的错误:
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
我们是否可以测试接受自定义对象列表参数的私有函数?

monwx1rj

monwx1rj1#

不要使用反射,只需创建方法internal,然后直接从测试中调用它,甚至可以添加注解,如@VisibleForTesting@TestOnly,这些注解可以在各种库中找到。

goucqfw6

goucqfw62#

您可以使用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)
    }
}

相关问题