Mockito: Lista dopasowań z rodzajami

167

Mockito oferuje:

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

Jak uniknąć ostrzeżenia, jeśli zamiast tego processbierze List<Bar>?

Philippe Blayo
źródło

Odpowiedzi:

279

W przypadku języka Java 8 i nowszych jest to łatwe:

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

W przypadku języka Java 7 i starszych kompilator potrzebuje trochę pomocy. Zastosowanie anyListOf(Class<T> clazz):

when(mock.process(Matchers.anyListOf(Bar.class)));
artbristol
źródło
16
Uwaga: jest to przestarzałe w Mockito 2. * i zostanie usunięte w Mockito 3. Przestarzałe, ponieważ kompilator Java 8 może teraz wywnioskować typ.
Kip
@artbristol. Czy wiesz, czy z anySet () powinno działać tak samo jak anyList ()? Jestem w Javie 8 i pojawia się ostrzeżenie w Eclipse IDE
Fernando Fradegrada
1
Lepiej używać anyListOf. Mimo że anyListdziała, emituje ostrzeżenie.
balki
3
anyListOfjest przestarzały, więc lepiej go NIE używać. Przykład dla Java 8 nie działa w przypadku przeciążenia metody, na przykład jeśli masz metodę akceptującą 2 różne listy: List<DBEntity>i List<DTO>rozwiązałem ten problem, używając ArgumentMatchersz generic:when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
edufinn
14

Oprócz anyListOfpowyższego zawsze możesz jawnie określić typy ogólne, używając następującej składni:

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

Java 8 nowo umożliwia wnioskowanie o typie na podstawie parametrów, więc jeśli używasz Java 8, może to również działać:

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

Pamiętaj, że ani any()ani nie anyList()będą stosować żadnych kontroli, w tym kontroli typu lub null. W Mockito 2.x any(Foo.class)zostało zmienione na „dowolne instanceofFoo”, ale any()nadal oznacza „dowolną wartość, w tym null”.

UWAGA: Powyższe zostało przełączone na ArgumentMatchers w nowszych wersjach Mockito, aby uniknąć kolizji nazw z org.hamcrest.Matchers. Starsze wersje Mockito będą musiały nadal używać org.mockito.Matchersjak powyżej.

Jeff Bowman
źródło
4
Matchers.any()jest bardzo wygodny!
MBach
Dopasowania są teraz przestarzałe. Oto informacje z mockito „Użyj ArgumentMatchers. Ta klasa jest teraz przestarzała, aby uniknąć konfliktu nazw z klasą Hamcrest org.hamcrest.Matchers. Ta klasa prawdopodobnie zostanie usunięta w wersji 3.0”. static.javadoc.io/org.mockito/mockito-core/2.7.21/org/mockito/…
oddmeter
@oddmeter Wprowadzono zmiany.
Jeff Bowman
5

Przed Java 8 (wersje 7 lub 6) używam nowej metody ArgumentMatchers.anyList:

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

verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());
Miguel R. Santaella
źródło