1

我有一个A像下面这样的类:

class A(b: B) : B by b // Note the implementation of interface B by delegation to parameter b

interface B {
    fun memberFunction() {}
}

fun B.extensionFunction() {}

我现在想验证B#extensionFunction正在调用。我怎么做?

我可以B#memberFunction这样验证:

class BImpl : B // Dummy implementation needed to instantiate interface B

@Test
fun `memberFunction can be verified`() {
    val bSpy = spyk<B>(BImpl)
    val a = A(bSpy)

    a.memberFunction()

    verify { bSpy.memberFunction() }
}

但是,相同的测试B#extensionFunction并不能解决问题。相反,我得到一个java.lang.AssertionError. 验证失败,因为调用没有发生。(请注意,您必须使用静态模拟(使用mockkStatic函数)才能验证扩展函数。)

作为参考,使用的库:

  • org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.11
  • junit:junit:4.12
  • io.mockk:mockk:1.9
4

1 回答 1

1

您可以简单地验证在委托人本身上调用的扩展函数,即在您的示例中a

@Test
fun `extensionFunction can be verified`() = mockkStatic("your.package.name.FilenameKt") {
    val a = A(BImpl)

    a.extensionFunction()

    verify { a.extensionFunction() }
}

这看起来微不足道,但如果调用a.extensionFunction()是在您的测试方法中的另一个调用的下游进行的,这将验证扩展方法正在被调用a

这很有效,因为a它是B(通过参数b)。鉴于这一事实,您可以验证正在拨打的电话a

于 2019-03-08T15:27:24.667 回答