#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. Да, это еще один способ ссылаться на несколько функций расширения в файле.