Есть ли способ захвата списка определенного типа с помощью mockitos ArgumentCaptore. Это не работает:
ArgumentCaptor<ArrayList<SomeType>> argument = ArgumentCaptor.forClass(ArrayList.class);
java
unit-testing
junit
mockito
Андреас Кёберле
источник
источник
ArrayList
). Вы всегда можете использоватьList
интерфейс, и если вы хотите представить факт, что он ковариантен, то вы можете использоватьextends
:ArgumentCaptor<? extends List<SomeType>>
Ответы:
Вложенной непатентованной проблемы можно избежать с помощью аннотации @Captor :
источник
MockitoAnnotations.initMocks(this)
в@Before
методе, а не использовать бегуна, который исключает возможность использовать другого бегуна. Тем не менее, +1, спасибо за указание на аннотацию.Да, это общая проблема дженериков, а не специфическая для мокито.
Для объекта нет объекта класса
ArrayList<SomeType>
, и, таким образом, вы не можете безопасно передавать этот объект методу, требующему aClass<ArrayList<SomeType>>
.Вы можете привести объект к нужному типу:
Это выдаст несколько предупреждений о небезопасных приведениях, и, конечно, ваш ArgumentCaptor не сможет по-настоящему провести различие между
ArrayList<SomeType>
иArrayList<AnotherType>
без проверки элементов.(Как уже упоминалось в другом ответе, хотя это общая проблема общего характера, для аннотации существует специфическое для Mockito решение проблемы безопасности типов
@Captor
. Он по-прежнему не может различитьArrayList<SomeType>
иArrayList<OtherType>
.)Редактировать:
Взгляните также на комментарий Тэнши . Вы можете изменить исходный код с Paŭlo Ebermann на этот (гораздо проще)
источник
ArgumentCaptor<List<SimeType>> argument = ArgumentCaptor.forClass((Class) List.class);
@SuppressWarnings("unchecked")
аннотацию над строкой определения захвата аргумента. Кроме того, приведение кClass
излишним.Class
не является лишним в моих тестах.Если вы не боитесь старой семантики в стиле java (не являющейся типичной безопасностью), это также работает и достаточно просто:
источник
источник
Основываясь на комментариях @ tenhi и @ pkalinow (также благодарности @rogerdpack), ниже приводится простое решение для создания захватчика аргументов списка, который также отключает предупреждение «использует непроверенные или небезопасные операции» :
Полный пример здесь и соответствующий проход сборки CI и тестовый запуск здесь .
Наша команда уже некоторое время использует это в наших модульных тестах, и это выглядит как самое простое решение для нас.
источник
Для более ранней версии junit вы можете сделать
источник
У меня была та же проблема с тестированием в моем приложении для Android. Я использовал
ActivityInstrumentationTestCase2
иMockitoAnnotations.initMocks(this);
не работал. Я решил эту проблему с другим классом с соответствующим полем. Например:Затем в методе проверки активности:
источник
В GitHub Mockito есть открытая проблема именно об этой проблеме.
Я нашел простой обходной путь, который не заставляет вас использовать аннотации в ваших тестах:
То , что происходит здесь в том , что мы создаем новый класс с в
@Captor
аннотации и ввести в нее захватчик. Затем мы просто извлекаем захватчик и возвращаем его из нашего статического метода.В своем тесте вы можете использовать его так:
Или с синтаксисом, который похож на Джексона
TypeReference
:Это работает, потому что Mockito на самом деле не нуждается в информации о типах (в отличие от сериализаторов, например).
источник