Mockito.any() pass Интерфейс с Generics

Можно ли передать тип интерфейса с помощью дженериков?

Интерфейс:

public interface AsyncCallback<T>

В моем методе тестирования:

Mockito.any(AsyncCallback.class)

Помещение <ResponseX> позади или для .class не работает.

Ответ 1

Существует безопасный тип: используйте ArgumentMatchers.any() и квалифицируйте его с типом:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

как pierrefevrier, упомянутый в комментариях, с новыми версиями Mockito it

Matchers.<AsyncCallback<ResponseX>>any()

Ответ 2

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

Ответ 3

Мне пришлось принять следующий механизм, чтобы разрешить дженерики:

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

Надеюсь, это поможет кому-то.

Ответ 4

Проводя комментарий pierrefevrier как ответ, который может быть полезен, если он присутствует в ответе вместо комментариев.

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

Ответ 5

Вы можете просто бросить его, добавив, если хотите: подавить предупреждения:

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

Если Java допускает "общие" дженерики, у них может быть такой метод, который вы ищете

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

Ответ 6

В дополнение к thSoft ответ на ввод квалифицированного вызова в метод any() означает, что я мог бы удалить квалификацию, так как допустимый вывод возвращаемого типа:

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