调用 spyk 数据的函数 class

Calling a function of a spyk'd data class

我有一个数据class A,其功能如下:

data class A(val a: String) {
  fun foo(b: String) = "$a, $b"
}

我在测试中尝试以下模拟:

fun `whatever`() {
  val spy = spyk<A>()
  every { spy.a } returns "Tree"
  assertThat(spy.foo("Snake")).isEqualTo("Tree Snake")
}

当我 运行 编写这样的测试时,它失败并在数据 class 中的 fun foo... 行出现 NullPointerException。 =13=]

我是不是做错了什么或者这是 MockK 中的错误?

当我 运行 你的代码时,我得到了完全不同的结果。首先它抱怨没有默认构造函数。

然后我将其修复为使用非默认构造函数并打印 "abc Snake"

val spy = spyk(A("abc"))
every { spy.a } returns "Tree"
println(spy.foo("Snake"))

这是有原因的。 Kotlin 正在通过 foo 函数中的字段访问 a 属性。这似乎是一种优化。

MockK 目前无法对此做任何事情。有如下ticket to transform getfield call: https://github.com/mockk/mockk/issues/104