Mockito.any () передає інтерфейс із Generics


171

чи можна передавати тип інтерфейсу з дженериками?

Інтерфейс:

public interface AsyncCallback<T>

У моєму методі тестування:

Mockito.any(AsyncCallback.class)

Поставивши <ResponseX>позаду чи не .classпрацював.

Відповіді:


306

Існує безпечний для вас спосіб: використовуйте ArgumentMatchers.any()та кваліфікуйте його за типом:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

4
Я підтверджую, що ця відповідь працює і правильно придушує попередження.
kevinarpe

1
Це насправді не безпечніше, оскільки фактичний метод так чи інакше можна викликати лише правильно введеним аргументом. Просто потрібно було задовольнити компілятор pre-java8, який не мав такого виду типу.
герман

Я використав щось на зразок цього ResponseEntity <Список <Карта <Строка, Об'єкт >>> responseEntity = Матчі. <ResponseEntity <Список <Карта <Строка, Об'єкт >>>> будь-який (); І це завжди повертається до нуля
Arun

6
З новими версіями Mockito:(Matchers.<AsyncCallback<ResponseX>>any()
pierrefevrier

15
Matchersнасправді застаріло, але ArgumentMatchersпрацювало.
guijob

67

Використовуючи Java 8, ви можете просто використовувати any()(припускаючи статичний імпорт) без параметра аргументу чи типу через розширені умовиводи. Тепер компілятор з цільового типу (тип аргументу методу) знає, що ви насправді маєте на увазі Matchers.<AsyncCallback<ResponseX>>any(), що є попереднім рішенням Java 8.


Не any()відповідали б AsyncCallback<AnyOtherType>також?
Матвій

@MatthewRead Using AsyncCallback<AnyOtherType>навіть не слід компілювати, якщо типом аргументу є "AsyncCallback <ResponseX>".
герман

1
Мене цікавить ситуація, коли тип аргументу також загальний, але ви хочете знущатися над ним лише з одного конкретного типу (або знущатися над декількома типами різними способами). Наведено, when(x.y(any())).thenAnswer(...)наприклад, де yзнаходиться public <T> T y(AsyncCallback<T> arg). Можливо, було б краще перевірити тип у відповіді, якщо це саме те, що потрібно?
Матвій

2
@MatthewRead Через стирання Mockito фактичний тип неможливо перевірити під час виконання. Тому ви навіть не можете користуватися isA(). Якщо об'єкт містить Classоб'єкт, відповідний типу, і інтерфейс відкриває це, я думаю, ви могли б перевірити його в спеціальному збірнику. Або, наприклад, у випадку, коли Collectionви можете перевірити тип елементів.
герман

1
Matchersбув замінений на ArgumentMatchersMockito v2
bheussler

15

Я повинен був прийняти наступний механізм, щоб дозволити генеричні засоби:

import static org.mockito.Matchers.any;
List<String> list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);

Сподіваюся, що це комусь допоможе.


3
Дивіться мою відповідь: для Java 8 це більше не потрібно
герман

5

Розміщення коментаря pierrefevrier як відповідь, яка може бути корисною, якщо він міститиметься у відповіді замість коментарів.

З новими версіями Mockito: (Matchers.<AsyncCallback<ResponseX>>any()


1
Я додав свій коментар до оригінальної відповіді
Joergi

2

Надалі відповідь thSoft, що кваліфікував виклик до будь-якого () методу, означав, що я можу видалити кваліфікацію, оскільки тип повернення дозволив зробити висновок:

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}

0

Ви можете просто подати його, додавши придушення попередження, якщо вам подобається:

@SuppressWarnings("unchecked")    
AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class)

Якщо Java дозволила б "generic" generic, вони могли б мати такий метод, як це те, що ви шукаєте

private static <T, E> T<E> mock(Class<T<E>> clazz)

Коли я спробував це, я отримав помилку в своєму тесті:You cannot use argument matchers outside of verification or stubbing.
kevinarpe

Недобра ідея для використання @SuppressWarnings: pre-java 8, якщо ви збираєтесь призначити її окремій змінній, ви можете просто використовувати, any()як у відповідіINtoy. Тепер з java 8 any()можна використовувати вбудований без необхідності окремого призначення.
герман

@kevinarpe, якщо у вас є кілька відповідників аргументів, їх потрібно викликати так, як вказує мова Java.
TWiStErRob

0

У мене була схожа проблема із використанням Spring Example:

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());

Тут ви повинні використовувати кваліфікацію, метод b / c findAll може приймати кілька типів, як Sortі Iterable. Ви також можете використовувати Mockito.any(Example.class)курс із попередженням про безпеку типу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.