代码之家  ›  专栏  ›  技术社区  ›  NameAlex

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

  •  2
  • NameAlex  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  4
  •   Roman Safronov    6 年前

    根据 documentation 对于模块范围的扩展功能,您需要 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()
                }
            }
        }
    }
    
    推荐文章