Невозможно проверить обратные вызовы с помощью mockk: invoke (any ())) не был вызван - PullRequest
0 голосов
/ 12 июля 2019

Дано

typealias MyCallback = (s: String) -> Unit

object Hello {
    fun main() {
        blah { print(it) }
    }
    fun blah(cb: MyCallback) {
        cb.invoke("hi")
    }
}

или

interface MyCallback {
    fun invoke (s: String) {}
}

object Hello {
    fun main() {
        blah(object : MyCallback {
            override fun invoke(s: String) {
                print(s)
            }
        })
    }
    fun blah(cb: MyCallback) {
        cb.invoke("hi")
    }
}

С обоими я получаю вышеуказанную ошибку (Verification failed: call 1 of 1: MyCallback(#2).invoke(any())) was not called) при выполнении

    @Test
    fun testInvoke() {
        val mock = mockk<Hello>(relaxed = true)
        val cb = mockk<MyCallback>()
        mock.blah(cb)
        verify { cb.invoke(any()) }
    }

как это исправить?

1 Ответ

1 голос
/ 19 июля 2019

Это сработало для меня. Объект Hello не нуждается в макете, так как это класс, который тестируется. Путем насмешек он тестировал только записи вызовов blah(), а не их фактическое выполнение.

Использование spyk вместо mockk позволяет создать тип MyCallback, позволяющий определить функцию invoke(). Так что, возможно, это скорее обходной путь, чем объяснение того, почему mockk, похоже, не сохраняет эту информацию о типе.

typealias MyCallback = (s: String) -> Unit

object Hello {
    fun main() {
        blah { print(it) }
    }
    fun blah(cb: MyCallback) {
        cb.invoke("hi")
    }
}

class MockKTest {

    @Test
    fun testInvoke() {
        val mock = spyk<Hello>()
        val cb = mockk<MyCallback>(relaxed = true)
        mock.blah(cb) // or just do Hello.blah(cb)
        verify { cb.invoke(any()) }
    }
}
...