MockK не может имитировать функции, определенные вне их класса

#kotlin #mockk

#kotlin #mockk

Вопрос:

Насколько я вижу, MockK не может имитировать функции, которые определены на уровне пакета (а не в классе, к которому они принадлежат). Вот небольшой пример:

 package some.package

class A {}
class B {}

fun A.getB() : B {
  println("real getB called!")
  return B()
}
 

И класс для его проверки:

 class Test {

  @MockK
  private lateinit var a : A

  @BeforeMethod
  fun setUp() {
    init(this)
    val bMock = mockk<B>()
    every { a.getB() } returns bMock
  }

  @Test
  fun test() {
    a.getB()
  }
}
 

Этот тест завершается неудачей с сообщением типа Missing calls inside every { ... } block . Но если я перемещу функцию getB() в класс A , то тест пройдет успешно. Я не смог найти никакой документации по этому поведению. Есть ли какой-либо обходной путь для этого? К сожалению, в моем реальном проекте у меня нет возможности переместить функцию в класс. Есть ли какой-либо другой способ решить эту проблему?

Ответ №1:

Вам нужно сослаться на функцию расширения, с которой вы издеваетесь mockkStatic . Это для функций расширения вне классов.

mockkStatic(a::getB)

Комментарии:

1. Да, спасибо! Но не с ::getB в качестве аргумента, а с именем пакета и файла в виде строки, поэтому в моем случае (при условии, что File.kt — это имя файла): mockkStatic(«some.package. FileKt»)

2. Да, это еще один способ ссылаться на несколько функций расширения в файле.