Mockito предлагает:
when(mock.process(Matchers.any(List.class)));
Как избежать предупреждения , если process
берет List<Bar>
вместо этого?
Mockito предлагает:
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 не работает в случае перегрузки метода, например, если у вас есть метод, принимающий 2 разных списка: 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());