Вызов функции класса данных spyk'd

У меня есть класс данных 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")
}

Когда я запускаю тест, написанный следующим образом, он завершается с ошибкой NullPointerException в строке fun foo... в классе данных.

Я делаю что-то не так или это ошибка в MockK?

1 ответ

Решение

У меня совершенно разные результаты, когда я запускаю ваш код. Во-первых, он жалуется, что нет конструктора по умолчанию.

Затем я исправил это использование конструктора не по умолчанию, и он печатает "abc Snake"

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

Для этого есть причина. Kotlin получает доступ a собственность через поле в foo функция. Это похоже на оптимизацию.

Getfield Call

MockK сейчас ничего не может с этим поделать. Есть следующий билет для трансформации getfield позвоните: https://github.com/mockk/mockk/issues/104

Другие вопросы по тегам