Насколько я вижу, 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
, то тест пройдет успешно. Я не смог найти никакой документации по этому поведению. Есть ли обходной путь для этого? К сожалению, в моем реальном проекте у меня нет возможности переместить функцию в класс. Есть ли другой способ решить эту проблему?
Вам нужно сослаться на функцию расширения, над которой вы издеваетесь, с помощью mockkStatic
. Это для функций расширения вне классов.
mockkStatic(a::getB)
Да, это еще один способ сослаться на несколько функций расширения в файле.
Ага, спасибо! Но не с a::getB в качестве аргумента, а с именем пакета и файла в виде строки, поэтому в моем случае (при условии, что File.kt — это имя файла): mockkStatic("some.package.FileKt")