【问题标题】:How do I verify calls being made to a parameter used as delegate (delegation)?如何验证对用作委托(委托)的参数进行的调用?
【发布时间】:2019-03-08 15:27:24
【问题描述】:

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

【问题讨论】:

  • 请注意,因为(在本例中)BImplobject,我也可以使用mockkObject 而不是spyk。但是,使用 spyk 也可以,而且更通用。

标签: unit-testing kotlin mockk


【解决方案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 上进行的呼叫。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2018-11-11
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多