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<*, *>>())
我正在使用 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<*, *>>())