Как макет функции расширения Kotlin в интерфейсе? - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть функция расширения для интерфейса, подобная следующей:

import javax.jms.ConnectionFactory

fun ConnectionFactory.foo() {
    println("do some stuff")
}

Как я могу издеваться над функцией foo?

Обратите внимание, я видел подходы для классов и объектов в http://mockk.io/#extension-functions, но это не работает.Я пробовал это:

import io.mockk.classMockk
import io.mockk.every
import org.junit.Test
import javax.jms.ConnectionFactory

class ExtensionFunctionTest {
@Test
fun mockExtensionFunction() {
    val connectionFactory = classMockk(ConnectionFactory::class)
    every { connectionFactory.foo() } returns println("do other stuff")
    connectionFactory.foo()
}
}

Выдает исключение:

io.mockk.MockKException: Missing calls inside every { ... } block.

1 Ответ

0 голосов
/ 26 апреля 2018

В соответствии с документацией для функций расширения модуля необходимо staticMock «скрытый» класс, созданный для функции расширения. Вот пример (при условии, что имя файла com/sample/extmockingtest/SampleTest.kt):

fun <T> Iterable<T>.foo(): String  = "do some stuff"

class ExtensionFunctionTest {
    @Test
    fun mockExtensionFunction() {
        val itMock = classMockk(Iterable::class);
        staticMockk("com.sample.extmockingtest.SampleTestKt").use {
            every {
                itMock.foo()
            } returns "do other stuff"

            assertEquals("do other stuff", itMock.foo())

            verify {
                itMock.foo()
            }
        }
    }
}
...