如何在接口中模拟 Kotlin 扩展功能?
How mock Kotlin extension function in interface?
我有如下界面的扩展函数:
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.
根据 documentation 在模块范围扩展函数的情况下,您需要 staticMock
"hidden" class 创建扩展函数。
下面是一个例子(假设文件名是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()
}
}
}
}
我有如下界面的扩展函数:
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.
根据 documentation 在模块范围扩展函数的情况下,您需要 staticMock
"hidden" class 创建扩展函数。
下面是一个例子(假设文件名是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()
}
}
}
}