Mockito:列出具有泛型的匹配器


Answers:


278

对于Java 8及更高版本,很简单:

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

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

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

16
注意:在Mockito 2. *中已弃用此方法,在Mockito 3中将其删除。已弃用,因为Java 8编译器现在可以推断类型。
基普

@artbristol您知道withanySet()是否应该与anyList()一样工作吗?我使用Java 8,并且在Eclipse IDE中引发了警告
Fernando Fradegrada

1
更好地使用anyListOf。即使anyList有效,它也会发出警告。
巴尔基

3
anyListOf已弃用,因此最好不要使用它。在方法重载的情况下,Java 8的示例不起作用,例如,如果您有一个方法可以接受2个不同的列表:List<DBEntity>并且List<DTO>我已经解决了使用ArgumentMatchers泛型的问题:when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
edufinn

14

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)更改为表示“任何instanceofFoo”,但any()仍表示“任何值包括null”。

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


4
Matchers.any()很方便!
MBach

现在不推荐使用Matchers,这是来自嘲讽的信息“ Use ArgumentMatchers。为了避免与Hamcrest org.hamcrest.Matchers类发生名称冲突,现在不推荐使用此类。在3.0版中可能会删除该类。” static.javadoc.io/org.mockito/mockito-core/2.7.21/org/mockito/…–
奇数表

@oddmeter进行了更改。
杰夫·鲍曼

5

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

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

verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.