Mockito oferuje:
when(mock.process(Matchers.any(List.class)));
Jak uniknąć ostrzeżenia, jeśli zamiast tego process
bierze List<Bar>
?
Mockito oferuje:
when(mock.process(Matchers.any(List.class)));
Jak uniknąć ostrzeżenia, jeśli zamiast tego process
bierze List<Bar>
?
Odpowiedzi:
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)));
anyListOf
. Mimo że anyList
działa, emituje ostrzeżenie.
anyListOf
jest 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 ArgumentMatchers
z generic:when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
Oprócz anyListOf
powyż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 instanceof
Foo”, 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.Matchers
jak powyżej.
Matchers.any()
jest bardzo wygodny!
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());