【发布时间】:2012-05-09 08:22:58
【问题描述】:
Mockito 提供:
when(mock.process(Matchers.any(List.class)));
如果process 取而代之的是List<Bar>,如何避免警告?
【问题讨论】:
标签: java generics warnings mockito matcher
Mockito 提供:
when(mock.process(Matchers.any(List.class)));
如果process 取而代之的是List<Bar>,如何避免警告?
【问题讨论】:
标签: java generics warnings mockito matcher
对于 Java 8 及更高版本,这很容易:
when(mock.process(Matchers.anyList()));
对于 Java 7 及以下版本,编译器需要一些帮助。使用anyListOf(Class<T> clazz):
when(mock.process(Matchers.anyListOf(Bar.class)));
【讨论】:
anyListOf。即使anyList 有效,它也会发出警告。
anyListOf 已弃用,因此最好不要使用它。 Java 8 的示例在方法重载的情况下不起作用,例如,如果您有一个接受 2 个不同列表的方法:List<DBEntity> 和 List<DTO> 我已经使用 ArgumentMatchers 和泛型解决了这个问题:when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
除了上面的anyListOf 之外,您始终可以使用以下语法显式指定泛型:
when(mock.process(Matchers.<List<Bar>>any(List.class)));
Java 8 新允许基于参数的类型推断,因此如果您使用的是 Java 8,这可能也可以:
when(mock.process(Matchers.any()));
请记住,any() 和 anyList() 都不会应用任何检查,包括类型或空值检查。在 Mockito 2.x 中,any(Foo.class) 被更改为“任何instanceof Foo”,但any() 仍然表示“包括null 在内的任何值”。
注意:以上已在较新版本的 Mockito 中切换到 ArgumentMatchers,以避免与 org.hamcrest.Matchers 发生名称冲突。旧版本的 Mockito 需要继续使用org.mockito.Matchers,如上。
【讨论】:
Matchers.any()很方便!
在 Java 8(版本 7 或 6)之前,我使用新方法 ArgumentMatchers.anyList:
import static org.mockito.Mockito.*;
import org.mockito.ArgumentMatchers;
verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());
【讨论】:
我需要带有类型化 ArrayList 的 anyList(),以下方法有效:
(ArrayList<Bar>) ArgumentMatchers.<Bar>anyList()
【讨论】: