3

假设我有一个 Java 类 Metrics。我在 Kotlin 的 Metrics 上定义了一些扩展函数

fun Merics.expose(name: String, value: Number) {
 // do something
}

请注意,Java 类Metrics也有一个被调用expose但具有不同签名的方法。

我创建了一个测试,在其中模拟了一个对象并调用了应该调用metrics扩展函数的代码路径。expose但是我怎样才能验证那些扩展函数被调用了呢?

我尝试使用 mockk 和 mockito-kotlin,他们似乎都不知道该对象有一个用不同签名metrics调用的新函数。expose

4

1 回答 1

2

您无法验证是否在您的模拟上调用了扩展函数,因为它不是该类的一部分。扩展函数只是带有接收器的顶级函数(在您的情况下是 的实例Metrics)。

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

您可以使用mockkStatic做到这一点。您正在传递(生成的)扩展函数的路径。假设您Metrics在 package 中创建了扩展函数org.com。扩展类应该在: 中生成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()) } 
}
于 2021-04-18T11:41:55.520 回答