Как вы Mockk функции верхнего уровня Kotlin? - PullRequest
0 голосов
/ 19 октября 2018

Mockk позволяет имитировать статические функции, но как можно посмеяться над функцией верхнего уровня Kotlin?

Например, если у меня есть файл Kotlin с именем HelloWorld.kt, как мне издеватьсяsayHello() функция?


HelloWorld.kt

fun sayHello() = "Hello Kotlin!"

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Существует способ макетировать функцию верхнего уровня:

mockkStatic("pkg.FileKt")
every { fun() } returns 5

Вам просто нужно знать, к какому файлу относится эта функция.Проверьте JAR или трассировку стека.

0 голосов
/ 19 октября 2018

Опираясь на ответ Сергея:

Фактическая реализация функции sayHello() в переменной может иметь фактическое значение параметра функции по умолчанию sayHello().

Этот пример работает:

package tests

import io.mockk.every
import io.mockk.mockk
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test

val sayHelloKotlin = { "Hello Kotlin!" }
fun sayHello(producer: () -> String = sayHelloKotlin): String = producer()

class Tests {
    interface Producer {
        fun produce(): String
    }

    @Test
    fun `Top level mocking`() {
        val mock = mockk<Producer>()
        every { mock.produce() } returns "Hello Mockk"

        val actual = sayHello(mock::produce)
        Assertions.assertEquals(actual, "Hello Mockk")
    }
}

Проблема в том, что вы меняете производственный код только для обслуживания тестирования, и он кажется надуманным.

...