我有一个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
函数)才能验证扩展函数。)
供参考,使用的库:
答案 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
上被调用。
这仅是因为a
是B
(通过参数b
)才有效。鉴于这一事实,您可以验证在a
上进行的呼叫。