Kotlin:如何验证在模拟上调用了扩展函数

Kotlin: How to verify an extension function is called on a mock

假设我有一个 Java class 指标。我在 Kotlin

中定义了一些关于 Metrics 的扩展函数
fun Merics.expose(name: String, value: Number) {
 // do something
}

请注意 Java class Metrics 也有一个名为 expose 的方法,但具有不同的签名。

我创建了一个测试,其中我模拟了一个 metrics 对象并调用了一个代码路径,其中应该调用扩展函数 expose。但是如何验证这些扩展函数是否被调用?

我尝试使用 mockk 和 mockito-kotlin,其中 none 似乎知道 metrics 对象有一个名为 expose 的新函数,具有不同的签名。

您无法验证是否在您的 mock 上调用了扩展函数,因为它不是 class 的一部分。扩展函数只是一个带有接收器的顶级函数(在你的例子中是 Metrics 的实例)。

但您仍然可以验证您的代码中是否调用了扩展函数

您可以使用 mockkStatic 执行此操作。 您正在传递(生成的)扩展函数的路径。假设您在包 org.com 中创建了 Metrics 扩展函数。扩展 class 应该在以下位置生成:com.org.MericsExtensionKt.

想要验证对您的扩展函数的调用的测试可能如下所示:

@Test
fun check_metrics_expose_extension_was_called() {
  mockkStatic("com.org.MericsExtensionKt")

  // call your function that is calling Metrics.expose()
  // classUnderTest.someFunction()

  // this verifies a call to the extension function and their parameters
  verify { any<Metrics>().expose(name = any(), value = any()) } 
}