在 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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...