Мокіто пропонує:
when(mock.process(Matchers.any(List.class)));
Як уникнути попередження , якщо process
бере List<Bar>
замість цього?
Мокіто пропонує:
when(mock.process(Matchers.any(List.class)));
Як уникнути попередження , якщо process
бере List<Bar>
замість цього?
Відповіді:
Для 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 не працює в разі перевантаження методу, наприклад, якщо у вас є метод, який приймає два різних списки: List<DBEntity>
і List<DTO>
я вирішив цю проблему, використовуючи ArgumentMatchers
generic: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
».
ПРИМІТКА. Вищезгадане перейшло на ArgumentMatchers у новіших версіях Mockito, щоб уникнути зіткнення з іменем 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());