Mockito:列出具有泛型的Matchers

Phi*_*ayo 160 java generics warnings matcher mockito

Mockito提供:

when(mock.process(Matchers.any(List.class)));
Run Code Online (Sandbox Code Playgroud)

如何避免警告,如果process需要List<Bar>呢?

art*_*tol 263

对于Java 8及更高版本,它很容易:

when(mock.process(Matchers.anyList()));
Run Code Online (Sandbox Code Playgroud)

对于Java 7及更低版本,编译器需要一些帮助.用途anyListOf(Class<T> clazz):

when(mock.process(Matchers.anyListOf(Bar.class)));
Run Code Online (Sandbox Code Playgroud)

  • 注意:这在Mockito 2中已弃用.*将在Mockito 3中删除.不推荐使用,因为Java 8编译器现在可以推断出类型. (14认同)
  • `anyListOf` 已被弃用,所以最好不要使用它。Java 8 的示例在方法重载的情况下不起作用,例如,如果您有一个接受 2 个不同列表的方法: `List&lt;DBEntity&gt;` 和 `List&lt;DTO&gt;` 我已经使用 `ArgumentMatchers` 解决了这个问题通用:`when(adapter.adapt(ArgumentMatchers.&lt;DTO&gt;anyList())).thenCallRealMethod();` (5认同)
  • 最好使用`anyListOf`。即使“anyList”有效,它也会发出警告。 (2认同)

Jef*_*ica 14

除此之外anyListOf,您始终可以使用以下语法明确指定泛型:

when(mock.process(Matchers.<List<Bar>>any(List.class)));
Run Code Online (Sandbox Code Playgroud)

Java 8新允许基于参数的类型推断,因此如果您使用Java 8,这可能也有效:

when(mock.process(Matchers.any()));
Run Code Online (Sandbox Code Playgroud)

请记住,既any()不会也anyList()不会应用任何检查,包括类型或空检查.在Mockito 2.x中,any(Foo.class)改为"任何instanceofFoo",但any()仍然意味着"包括任何价值null".

注意:上面已经在较新版本的Mockito中切换到ArgumentMatchers,以避免名称冲突org.hamcrest.Matchers.较旧版本的Mockito需要继续使用org.mockito.Matchers如上所述.

  • ```Matchers.any()```非常方便! (3认同)

Mig*_*lla 10

在 Java 8(版本 7 或 6)之前,我使用新方法 ArgumentMatchers.anyList:

import static org.mockito.Mockito.*;
import org.mockito.ArgumentMatchers;

verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());
Run Code Online (Sandbox Code Playgroud)