在 Kotlin 中模拟“全局”属性

问题描述

有没有办法改变运行单元测试时调用属性访问器的返回值?喜欢模拟属性 settingsstate 的结果?

我正在学习创建单元测试。该类所做的是将存储的数据带入程序,这些数据以可视化的形式给出。在我的测试中,我想定义那里发生了什么,因为窗口不会在那里打开。

// top-level declaration outside class
val settingsstate: ApplicationSettingsstate
    get() = ServiceManager.getService(ApplicationSettingsstate::class.java)

解决方法

settingsState 不是变量。这是一个财产。

我不知道有什么方法可以模拟全局属性(或全局函数)。模拟的工作方式是巧妙地创建一个对象,该对象从外部看起来有点像要模拟的对象,但在内部表现不同。在没有要模拟的对象的情况下,没有办法进行模拟。

也就是说,在字节码级别上没有全局变量、属性等。它们都包含在类中,因为 JVM 喜欢这样。一些巧妙的字节码操作或许能够达到某种效果——但不是 MockK。

如果您有模拟对象,则可以模拟该属性。解释一下文档:

val mock = mockk(Bus())
every { mock getProperty "speed" } returns 33