android - Mockk 模拟 Kotlin 的私有(private)属性(property)

标签 android unit-testing testing mockk

我有一个带有私有(private)字段的简单类。

class EmployeeData {

    private var employeeAge: Int = 0
    
    fun getAge(): Int {
        return 1 + employeeAge
    }
}
我正在尝试测试这个私有(private) employeeAge来自官方文档的以下内容
@Test
fun testPrivateAge() {

    val mock = spyk(EmployeeData())

    every {
        mock getProperty "employeeAge"
    } propertyType Int::class answers { fieldValue + 6 }
    every {
        mock setProperty "employeeAge" value any<Int>()
    } propertyType Int::class answers  { fieldValue += value }


    every { mock getProperty "employeeAge" } returns 33
    every { mock setProperty "employeeAge" value less(5) } just Runs

    assertEquals(10,mock.getAge())
}
我从 MockK 收到这样的异常
io.mockk.MockKException: Missing calls inside every { ... } block.

at io.mockk.impl.recording.states.StubbingState.checkMissingCalls(StubbingState.kt:14)
at io.mockk.impl.recording.states.StubbingState.recordingDone(StubbingState.kt:8)
关于我做错了什么的任何线索?官方文档建议对私有(private)属性(property)使用这种技术,但对我来说它不起作用,我正在使用最新版本的 MockK,它是 v1.10.0 .
尽管对于私有(private)方法,它的工作原理很吸引人。我能够在这个逻辑中测试私有(private)方法。

最佳答案

这是一些 Kotlin 优化的问题。根据 MockK 作者“简要说明。模拟私有(private)属性几乎是不可能的,因为它们没有附加 getter 方法。这是一种 Kotlin 优化,解决方案是重大变化。”
可以在这 2 个 Github 问题上找到更多信息:

  • https://github.com/mockk/mockk/issues/263
  • https://github.com/mockk/mockk/issues/104
  • 关于android - Mockk 模拟 Kotlin 的私有(private)属性(property),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61786233/

    相关文章:

    android - Intent extra 返回 null

    android - 我如何将Gradle降级到4.10.1

    java - 三叶草:它是如何工作的?

    regex - QTP:如何在检查点属性编辑对话框中获取 "complex value"编辑控件?

    c++ - 在 Visual Studio 2015 中添加构建目标

    java - 如何修复 API 版本 23 的 androidx 中的 FloatingActionButton 膨胀错误?

    android - 如何在 Android Studio 中打开 Gradle 项目(修复 "gradle sync fails error")——打开 zip 文件时出错

    unit-testing - 如何使用hibernate执行sql脚本文件?

    c++ - 如何测试序列生成器是否会生成预期的项目?

    django - 如何使用 Postman 使用参数命中 Django api?