如何在接口中模拟Kotlin扩展功能?

如何在接口中模拟Kotlin扩展功能?,kotlin,mockito,powermock,mockk,Kotlin,Mockito,Powermock,Mockk,我有一个接口扩展函数,如下所示: import javax.jms.ConnectionFactory fun ConnectionFactory.foo() { println("do some stuff") } 如何模拟函数foo? 请注意,我在中见过类和对象的方法,但它不起作用。我试过这个: import io.mockk.classMockk import io.mockk.every import org.junit.Test import javax.jms.Conne

我有一个接口扩展函数,如下所示:

import javax.jms.ConnectionFactory

fun ConnectionFactory.foo() {
    println("do some stuff")
}
如何模拟函数foo? 请注意,我在中见过类和对象的方法,但它不起作用。我试过这个:

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.
根据模块范围扩展函数的情况,您需要为扩展函数创建“隐藏”类。 下面是一个示例(假设文件名为
com/sample/extmockingtest/SampleTest.kt
):

fun Iterable.foo():String=“做点什么”
类扩展函数测试{
@试验
fun mockExtensionFunction(){
val-itMock=classmock(Iterable::class);
staticMockk(“com.sample.extmockingtest.SampleTestKt”).use{
每一个{
itMock.foo()
}返回“做其他事情”
assertEquals(“做其他事情”,itMock.foo())
核实{
itMock.foo()
}
}
}
}

扩展函数所在的文件名是什么?这是一个完全可验证的示例,还是类不同?该函数在类ConnectionFactory之外定义,并且是模块范围的。下面是接口
listOf(1,2,3)
的定义实现,但是我们可以在接口上模拟,比如
Iterable.foo()
?当然,我们可以替换
listOf()
带有
val itMock=classmock(Iterable::class)
。然后我们可以在
内部使用此模拟,每个
验证
。我已经更新了原始代码示例以涵盖这个案例。
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()
            }
        }
    }
}