如何验证对用作委托(委托)的参数的调用?

时间:2019-03-08 15:27:25

标签: unit-testing kotlin mockk

我有一个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

1 个答案:

答案 0 :(得分: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上被调用。

这仅是因为aB(通过参数b)才有效。鉴于这一事实,您可以验证在a上进行的呼叫。