【问题标题】:How mock Kotlin extension function in interface?如何在界面中模拟 Kotlin 扩展功能?
【发布时间】:2018-04-24 21:46:48
【问题描述】:

我有如下接口的扩展功能:

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.

【问题讨论】:

  • 你的扩展函数的文件名是什么?这是完整的可验证示例,还是类不同?
  • 该函数在 ConnectionFactory 类之外定义,并且是模块范围的。

标签: kotlin mockito powermock mockk


【解决方案1】:

根据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()
            }
        }
    }
}

【讨论】:

  • 这里是接口listOf(1, 2, 3)的定义实现,但是我们可以模拟一个接口,比如Iterable&lt;T&gt;.foo()吗?
  • 当然,我们可以将listOf() 替换为val itMock = classMockk(Iterable::class)。然后我们可以在everyverify 中使用这个模拟。我已经更新了原始代码示例以涵盖这种情况。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多