Kotlin 用Mock模拟私有财产抛出一个免责声明

Kotlin 用Mock模拟私有财产抛出一个免责声明,kotlin,mockk,Kotlin,Mockk,我在科特林测试用的。但我似乎无法覆盖间谍对象中的私有属性 我有这个东西 private val driverMapSnapshotMap: MutableMap<Int, SnapshotImage> = mutableMapOf() 但当我试图用模拟值填充它时,我得到了一个错误 every { viewModel getProperty "driverMapSnapshotMap" } returns(mapOf(1 to mockkClass(SnapshotImage

我在科特林测试用的。但我似乎无法覆盖间谍对象中的私有属性

我有这个东西

private val driverMapSnapshotMap: MutableMap<Int, SnapshotImage> = mutableMapOf()
但当我试图用模拟值填充它时,我得到了一个错误

every {
    viewModel getProperty "driverMapSnapshotMap"
} returns(mapOf(1 to mockkClass(SnapshotImage::class)))
我得到的错误

io.mockk.MockKException: Missing calls inside every { ... } block.
有什么想法吗?

应该有

every {
viewModel getProperty "driverMapSnapshotMap"
} returns mock(DriverRemoteModel::class)
模拟私有属性几乎是不可能的,因为它们没有附加getter方法。这是一种Kotlin优化和解决方案的重大变化

以下是针对同样问题的问题:


这里有一个在mock中访问类的私有字段的解决方案(对于对象来说更简单)

课堂用语{
private val prefix by lazy{“下面是我要说的:”}
有趣的说法(短语:String):String{
返回前缀+短语;
}
}
@以前
fun setUp()=MockKAnnotations.init(此,relaxUnitFun=true)
@试验
有趣的话{
mockkConstructor(SaySomething::class)
每个{anyConstructed()getProperty“prefix”}propertyType String::类返回“我不想说什么,但仍然:
val ss=SaySomething()
断言(如“生命短暂,充分利用它”),包含字符串(“我什么都不想说”))
}

“driverMapSnapshotMap”是一个可变映射,因此我返回一个映射对象哦,但现在我看到了,我在这里模拟了错误的对象,它应该是
SnapshotImage
好的,将其更改为正确的对象,但仍然没有成功是的,很抱歉没有更新,但我最终通过ReflectionOHHHH访问了私有属性,我明白了。对这种情况进行反思是令人悲哀的。但是如果你没有直接的方法,我们能做什么呢。我很高兴你找到了“解决方案”
every {
viewModel getProperty "driverMapSnapshotMap"
} returns mock(DriverRemoteModel::class)
 class SaySomething {
    private val prefix by lazy { "Here is what I have to say: "}

    fun say( phrase : String ) : String {
        return prefix+phrase;
    }
}

  @Before
fun setUp() = MockKAnnotations.init(this, relaxUnitFun = true)

 @Test
fun SaySomething_test() {

    mockkConstructor(SaySomething::class)
    every { anyConstructed<SaySomething>() getProperty "prefix" } propertyType String::class returns "I don't want to say anything, but still: "

    val ss = SaySomething()
    assertThat( ss.say("Life is short, make most of it"), containsString( "I don't want to say anything"))
}