Kotlin 仿冒私有财产

Kotlin 仿冒私有财产,kotlin,mockk,Kotlin,Mockk,假设我们有这样一个类: class无论什么{ private var something=false fun-aMethod():Int{ 如果(某物)返回{ 1. }否则{ 0 } } } 根据,看起来我应该能够做到以下几点: val classUnderTest=spyk(无论什么()) 每个{classUnderTest getProperty“something”}返回true 断言(classUnderTest.aMethod()).isEqualTo(1) 但是我得到的却是错误:

假设我们有这样一个类:

class无论什么{
private var something=false
fun-aMethod():Int{
如果(某物)返回{
1.
}否则{
0
}
}
}
根据,看起来我应该能够做到以下几点:

val classUnderTest=spyk(无论什么())
每个{classUnderTest getProperty“something”}返回true
断言(classUnderTest.aMethod()).isEqualTo(1)
但是我得到的却是错误:
io.mockk.MockKException:在每个{…}块中缺少调用


我使用的是mockk 1.8.5、kotlin 1.2.51

尝试使用答案而不是返回,如下所示:

val mock=spyk(MockCls(),recordPrivateCalls=true)
每个{mock.property}回答{fieldValue}
每个{mock getProperty“property”}propertyType Int::类回答{fieldValue+6}
每个{mock setProperty“property”value any()}propertyType Int::类回答{fieldValue+=value}
every{mock.property=any()}propertyType Int::class answers{
fieldValue=值+1
}然后{
fieldValue=值-1
}

您可以使用这个小扩展名

fun Any.mockPrivateFields(vararg mocks:Any):Any{
mocks.forEach{mock->
javaClass.declaredFields
.filter{it.modifiers.and(Modifier.PRIVATE)>0 | | it.modifiers.and(Modifier.PROTECTED)>0}
.firstOrNull{it.type==mock.javaClass}
?.同时{it.isAccessible=true}
?设置(此,模拟)
}
还这个
}
它设置作为参数传递的相同类型的第一个字段的值,并且可以使用多个参数,例如:

myObject.mockPrivateFields(1,“嗨!”)
它将模拟找到的第一个Int字段和第一个String字段

这仅适用于专用/受保护字段


您可以修改它以支持相同类型的多个字段。我没有尝试使用泛型,但我想支持它并不困难。

这可能是因为kotlin编译器为您的
属性提供了一些
属性

如果您将其修改为如下所示,该怎么办

class Whatever {
    private val something
        get() = false

    fun aMethod(): Int {
        return if( something ) {
            1
        } else {
            0
        }
    }
}

目前,AFAIK,私人。检查此行为发展的相关问题为什么不使用getter?嘲弄它。@RafaelRuizMuñoz不想公开或创建一个只用于测试的方法。你总是可以使用Super Reflect,但对我来说,我不知道如何使用,当
testCoverage false
@RafaelRuizMuñoz我试过了,但它不起作用。你真的试过了吗?这对你有用吗?这是一种非常有趣的方法。我想知道为什么它不是MockK库的一部分,带有像
@Inject