Mockito.any()传递与泛型的接口

lrx*_*rxw 145 java generics mockito

是否可以通过泛型传递接口的类型?

界面:

public interface AsyncCallback<T>
Run Code Online (Sandbox Code Playgroud)

在我的测试方法中:

Mockito.any(AsyncCallback.class)
Run Code Online (Sandbox Code Playgroud)

<ResponseX>后面或.class没有工作.

thS*_*oft 258

有一种类型安全的方法:使用ArgumentMatchers.any()和限定类型:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()
Run Code Online (Sandbox Code Playgroud)

正如pierrefevrier在评论中提到的那样,Mockito的新版本就是这样

ArgumentMatchers.<AsyncCallback<ResponseX>>any()
Run Code Online (Sandbox Code Playgroud)

  • `Matchers`实际上已被弃用,但`ArgumentMatchers`确实有效. (14认同)
  • 随着Mockito的新版本:`(Matchers.<AsyncCallback <ResponseX >> any()` (5认同)
  • 但坚持住!`any()` 和 `any(Class&lt;T&gt;)` 不做同样的事情。no-arg 匹配任何内容,但 1-arg 只匹配该类的内容。那么,像原始海报一样,您需要使用“any(Class)”而不是“any()”,那么如何做到这一点呢? (5认同)
  • 我确认这个答案有效,并正确地抑制了警告. (4认同)
  • `ArgumentMatchers.&lt;List&lt;S8Z2DETNSGDto&gt;&gt;any()` - IDE 提示我可以推断显式类型参数。这意味着不需要显式定义类型,并且“ArgumentMatchers.any()”将具有相同的结果 (3认同)
  • @QuantumMechanic——是的,这里有同样的问题。愚蠢的 Java 泛型不可能吗? (2认同)

her*_*man 58

使用Java 8,您可以简单地使用any()(假设静态导入)而不使用参数或类型参数,因为增强的类型推断.编译器现在知道您实际意味着的目标类型(方法参数的类型)Matchers.<AsyncCallback<ResponseX>>any(),这是Java 8之前的解决方案.

  • @MatthewRead由于擦除,Mockito无法在运行时检查实际类型。因此,您甚至不能使用isA()。如果该对象包含与该类型对应的“ Class”对象,并且该接口公开了该对象,那么我想您可以在自定义匹配器中对其进行检查。例如,如果是`Collection`,则可以检查元素的类型。 (2认同)

the*_*toy 14

我不得不采用以下机制来允许泛型:

import static org.mockito.Matchers.any;
List<String> list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人.

  • 请参阅我的回答:Java 8不再需要这样做. (3认同)

sag*_*sag 5

发布 pierrefevrier 评论作为答案,如果它出现在答案中而不是评论中,这可能会很有用。

使用新版本的 Mockito: (Matchers.<AsyncCallback<ResponseX>>any()