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
相关产品推荐
相关产品推荐

