Mockito: 使用泛型列出匹配器

Mockito 提供:

when(mock.process(Matchers.any(List.class)));

如何避免警告,如果 process采取一个 List<Bar>而不是?

181798 次浏览

对于 Java8及以上版本,这很简单:

when(mock.process(Matchers.anyList()));

对于 Java7及以下版本,编译器需要一些帮助。使用 anyListOf(Class<T> clazz):

when(mock.process(Matchers.anyListOf(Bar.class)));

除了上面的 anyListOf之外,您总是可以使用以下语法显式地指定泛型:

when(mock.process(Matchers.<List<Bar>>any(List.class)));

Java8最近允许基于参数的类型推断,所以如果您正在使用 Java8,这也可以很好地工作:

when(mock.process(Matchers.any()));

请记住,any()anyList()都不会应用任何检查,包括类型检查和空检查。在 Mockito 2.x 中,any(Foo.class)被改为表示“任何 instanceof Foo”,但是 any()仍然表示“包括 null在内的任何值”。

注意: 在 Mockito 的新版本中,上面已经切换到了 辩论比赛,以避免与 org.hamcrest.Matchers的名称冲突。旧版本的 Mockito 将需要像上面那样继续使用 ABc1。

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

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


verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());

我需要 anyList()和一个类型化的数组列表,下面的工作:

(ArrayList<Bar>) ArgumentMatchers.<Bar>anyList()