Можно ли передать тип интерфейса с генериками?
Интерфейс:
public interface AsyncCallback<T>
В моем методе испытаний:
Mockito.any(AsyncCallback.class)
Укладка <ResponseX>
сзади или .class
не работает.
Существует безопасный для типов способ: используйте ArgumentMatchers.any()
и уточняйте его с помощью типа:
ArgumentMatchers.<AsyncCallback<ResponseX>>any()
(Matchers.<AsyncCallback<ResponseX>>any()
Matchers
на самом деле устарела, ноArgumentMatchers
работает.Используя Java 8, вы можете просто использовать
any()
(при условии статического импорта) без аргумента или параметра типа из-за расширенного вывода типа. Компилятор теперь знает из целевого типа (тип аргумента метода), что вы на самом деле имеете в видуMatchers.<AsyncCallback<ResponseX>>any()
, что является решением до Java 8.источник
any()
подходитAsyncCallback<AnyOtherType>
?AsyncCallback<AnyOtherType>
не должен даже компилироваться, если тип аргумента - «AsyncCallback <ResponseX>».when(x.y(any())).thenAnswer(...)
например, гдеy
находитсяpublic <T> T y(AsyncCallback<T> arg)
. Возможно, было бы лучше проверить тип в ответе, если это то, что нужно?isA()
. Если объект содержитClass
объект, соответствующий типу, и интерфейс предоставляет это, я думаю, вы можете проверить это в пользовательском сопоставителе. Или, например, в случаеCollection
вы можете проверить тип элементов.Matchers
был заменен наArgumentMatchers
Mockito v2Я должен был принять следующий механизм, чтобы учесть дженерики:
Надеюсь, это кому-нибудь поможет.
источник
Публикация комментария Pierrefevrier в качестве ответа, который может быть полезен, если он присутствует в ответе вместо комментариев.
С новыми версиями Mockito:
(Matchers.<AsyncCallback<ResponseX>>any()
источник
В дополнение к ответу thSoft размещение квалифицированного вызова метода any () означало, что я могу удалить квалификацию, поскольку возвращаемый тип допускает логический вывод:
источник
Вы можете просто разыграть его, добавив подавляющие предупреждения, если хотите:
Если бы Java допускала «универсальные» генерики, они могли бы иметь такой метод, который вы ищете
источник
You cannot use argument matchers outside of verification or stubbing.
@SuppressWarnings
: pre-java 8, если вы собираетесь назначить ее отдельной переменной, вы можете просто использовать ее,any()
как в ответе Интой. Теперь с Java 8,any()
могут быть использованы inline без необходимости отдельного назначения.У меня была похожая проблема с использованием Spring
Example
:Здесь вы должны использовать квалификацию, так как метод findAll может иметь несколько типов, например
Sort
иIterable
. Вы также можете использоватьMockito.any(Example.class)
с предупреждением безопасности типа.источник