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)было изменено значение «любой instanceofFoo», но 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());