You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中使用MockK模拟var属性失败问题求助

问题原因与解决方案

核心原因

Kotlin编译器对var和val属性的内部访问逻辑做了不同优化:

  • 对于无自定义getter的var属性,类内部方法会直接访问幕后字段,而非调用getter方法。这导致你通过spyk模拟的getter拦截无法生效,getAllLights依然读取原始字段值5,最终返回7。
  • 对于val属性,即使无自定义getter,类内部方法也会调用getter方法,所以spyk的模拟能正常拦截,返回你设置的20+2=22。

解决方法

有两种可行方式让var属性的模拟生效:

方式1:显式调用getter方法

修改getAllLights方法,直接调用属性的getter:

class Car {
    var lights = 5
    fun getAllLights() = getLights() + 2 // 显式调用getter方法
}

方式2:给var属性添加自定义getter(即使是默认实现)

给lights属性添加自定义getter,强制编译器在内部访问时调用getter:

class Car {
    var lights = 5
        get() = field // 自定义getter,逻辑与默认一致
    fun getAllLights() = lights + 2
}

测试代码验证

修改后,原测试代码无需改动,模拟逻辑会正常生效:

val car = spyk(Car())
every { car.lights } returns 20
assertEquals(22, car.getAllLights()) // 测试通过

内容的提问来源于stack exchange,提问作者Ankur Samarya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 18:47:06