Mockito: список совпадений с дженериками

167

Mockito предлагает:

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

Как избежать предупреждения , если processберет List<Bar>вместо этого?

Филипп Блайо
источник

Ответы:

279

Для Java 8 и выше это просто:

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

Для Java 7 и ниже компилятору нужна небольшая помощь. Используйте anyListOf(Class<T> clazz):

when(mock.process(Matchers.anyListOf(Bar.class)));
artbristol
источник
16
Примечание: это устарело в Mockito 2. * и будет удалено в Mockito 3. Устаревшее, потому что компилятор Java 8 теперь может определять тип.
Кип
@artbristol Знаете ли вы, если с anySet () должен работать так же, как anyList ()? Я нахожусь на Java 8, и в Eclipse IDE
выдается
1
Лучше использовать anyListOf. Несмотря на то anyList, что работает, он выдает предупреждение.
Балки
3
anyListOfне рекомендуется, так что лучше НЕ использовать его. Пример для Java 8 не работает в случае перегрузки метода, например, если у вас есть метод, принимающий 2 разных списка: List<DBEntity>и List<DTO>я решил эту проблему с ArgumentMatchersпомощью generic:when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
edufinn
14

В дополнение к 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как указано выше.

Джефф Боуман
источник
4
Matchers.any()это очень удобно!
MBach
Matchers теперь устарели, вот информация из mockito: «Используйте ArgumentMatchers. Этот класс устарел, чтобы избежать столкновения имен с классом Hamcrest org.hamcrest.Matchers. Этот класс, вероятно, будет удален в версии 3.0». static.javadoc.io/org.mockito/mockito-core/2.7.21/org/mockito/…
oddmeter
@oddmeter Изменения сделаны.
Джефф Боуман
5

До Java 8 (версии 7 или 6) я использовал новый метод ArgumentMatchers.anyList:

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

verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());
Мигель Р. Сантелла
источник