Mockito: Listar Matchers com genéricos

167

Mockito oferece:

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

Como evitar o aviso se processleva um em List<Bar>vez disso?

Philippe Blayo
fonte

Respostas:

279

Para Java 8 e superior, é fácil:

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

Para Java 7 e abaixo, o compilador precisa de um pouco de ajuda. Use anyListOf(Class<T> clazz):

when(mock.process(Matchers.anyListOf(Bar.class)));
artbristol
fonte
16
Nota: isso foi descontinuado no Mockito 2. * e será removido no Mockito 3. Descontinuado porque o compilador Java 8 pode inferir o tipo agora.
Kip
@artbristol você sabe se com anySet () deve funcionar da mesma forma que anyList ()? Estou em Java 8 e um aviso é jogado no Eclipse IDE
Fernando Fradegrada
1
Melhor usar anyListOf. Mesmo que anyListfuncione, emite um aviso.
balki
3
anyListOfestá obsoleto, por isso é melhor NÃO usá-lo. Exemplo para Java 8 não funciona em caso de sobrecarga de método, por exemplo, se você tem um método aceitar 2 listas diferentes: List<DBEntity>e List<DTO>eu já resolveu este problema utilizando ArgumentMatcherscom genérica:when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
edufinn
14

Além do anyListOfacima, você sempre pode especificar genéricos explicitamente usando esta sintaxe:

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

O Java 8 permite recentemente a inferência de tipo com base em parâmetros; portanto, se você estiver usando o Java 8, isso também funcionará:

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

Lembre-se de que any()nem anyList()aplicarão nenhuma verificação, incluindo as de tipo ou nulas. No Mockito 2.x, any(Foo.class)foi alterado para significar "qualquer instanceofFoo", mas any()ainda significa "qualquer valor incluindo null".

NOTA: O item acima mudou para ArgumentMatchers nas versões mais recentes do Mockito, para evitar colisão de nomes org.hamcrest.Matchers. As versões mais antigas do Mockito precisarão continuar usando org.mockito.Matcherscomo acima.

Jeff Bowman
fonte
4
Matchers.any()é muito conveniente!
MBach
O Matchers agora está obsoleto, e aqui estão as informações do mockito "Usar ArgumentMatchers. Esta classe está obsoleta para evitar um conflito de nome com a classe Hamcrest org.hamcrest.Matchers. Esta classe provavelmente será removida na versão 3.0." static.javadoc.io/org.mockito/mockito-core/2.7.21/org/mockito/…
oddmeter
@oddmeter Alterações feitas.
22416 Jeff Bowman
5

Antes do Java 8 (versões 7 ou 6), eu uso o novo método ArgumentMatchers.anyList:

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

verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());
Miguel R. Santaella
fonte