Java 使用 Mockito 验证时来自 Kotlin 的泛型?

Java generics from Kotlin when verifying using Mockito?

我正在使用 Kotlin 1.6.10、Mockito 4.0.0 和 Java 8,并且我有一个 Java 接口定义如下:

public interface MyInterface {
    <D, T extends MyObject<T, D>> T doThings(T myObject);
}

此接口的一个实现用于 Kotlin 应用程序,我们有一个单元测试,我们希望在其中确保永远不会使用 Mockito 调用 doThings 方法。在 Java 我会这样做:

verify(myInterfaceInstance, never()).doThings(any());

但是如果我在 Kotlin 中这样做,我会得到一个编译时错误:

verify(myInterfaceInstance, never()).doThings(any())

Not enough information to infer type variable D

我明白为什么会这样,但我无法让它工作。在这种特殊情况下,我真的不关心泛型类型,我只想确保 doThings 永远不会被调用。我尝试了很多不同的东西,例如:

verify(myInterfaceInstance, never()).doThings<Any, MyObject<*, Any>>(any())

失败:

Type argument is not within its bounds.
Expected:
MyObject<MyObject<*, Any>!, TypeVariable(D)!>!
Found:
MyObject<*, Any!>!

我也试过了:

verify(myInterfaceInstance, never()).doThings<Any, MyObject<*, *>>(any())

和其他几个排列似乎都失败了,错误消息大致相同。

所以我的问题是,我怎样才能在 Kotlin 中完成与 Java 的 verify(myInterfaceInstance, never()).doThings(any()); 相同的操作?

这不是 Mockito 的答案,但是 Library Mockk 可以帮助您吗? MockK 是专门为 Kotlin 构建的,因此它可能对泛型处理有更好的支持。

验证看起来像:

verify(exactly = 0) { yourClass.doThings(any()) };

https://notwoods.github.io/mockk-guidebook/docs/mocking/verify/

https://mockk.io/#verification-atleast-atmost-or-exactly-times

这编译正常,但发出了几个警告,您可以通过尊重的注释来抑制它们:

@Suppress("TYPE_MISMATCH_WARNING", "UPPER_BOUND_VIOLATED_WARNING")
verify(myInterfaceInstance, never()).doThings<Any, MyObject<*, *>?>(any<MyObject<*, *>>())