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

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

Інтерфейс:

public interface AsyncCallback

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

Mockito.any(AsyncCallback.class)

Putting behind or for .class didnt work.

106

6 Відповіді

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

ArgumentMatchers.>any()

як згаданий у коментарі коментатор, з новими версіями Mockito це

Matchers.>any()
205
додано
Це насправді не безпечніше, оскільки фактичний метод можна викликати лише з правильно введеного аргументу. Треба просто задовольнити попередній компілятор java8, у якого не вистачало такого типу висновку.
додано Автор herman, джерело
Я використовував щось на зразок цього ResponseEntity <�Карта <�Стрічка, Об'єкт >>> responseEntity = Копіри. <�Список <�Карта <�Стрічка, Об'єкт >>>> будь-який (); І завжди повертає нуль
додано Автор Arun, джерело
Я підтверджую цю відповідь і правильно пригадає попередження.
додано Автор kevinarpe, джерело
Matchers фактично не підтримується, але працював ArgumentMatchers .
додано Автор guijob, джерело
Перший, який використовував ArgumentMatchers, працював для мене, а другий, який використовує Matchers, не підтримується. Я мав деяку плутанину у тому, що є ResponseX. однак отримав саму відповідь, у моєму випадку я написав так: ArgumentMatchers. <�Специфікація <�Виклик >> будь-який ()
додано Автор Barani r, джерело
З новими версіями Mockito: (Копіри. > any()
додано Автор pierrefevrier, джерело

Using Java 8, you can simply use any() (assuming static import) without argument or type parameter because of enhanced type inference. The compiler now knows from the target type (the type of the method argument) that you actually mean Matchers.>any(), which is the pre-Java 8 solution.

47
додано
@MatthewRead Використання AsyncCallback навіть не слід збирати, якщо тип аргументу - "AsyncCallback ".
додано Автор herman, джерело
@MatthewRead Через стирання, фактичний тип не може бути перевірений під час виконання Mockito. Таким чином, ви навіть не можете використовувати isA() . Якщо об'єкт зберігає об'єкт Class , який відповідає типу, і інтерфейс показує це, я думаю, ви можете перевірити його в користувальницькому об'єднанні. Або, наприклад, у випадку Collection ви можете перевірити тип елементів.
додано Автор herman, джерело
Matchers замінено на ArgumentMatchers в Mockito v2
додано Автор bheussler, джерело
Чи не відповідає any() AsyncCallback ?
додано Автор Matthew Read, джерело
Я задаюсь питанням про ситуацію, коли тип аргументу є загальним, але ви просто хочете висміювати його за одним конкретним типом (або збивайте його з різних типів різними способами). Наприклад, коли y є public T y (AsyncCallback when (xy (any ())), thenAnswer (...) > arg) . Можливо, було б краще перевірити тип у відповідь, якщо це потрібно?
додано Автор Matthew Read, джерело
Ах, ти абсолютно правий. Насправді я просто читав більше про видалення типу і чомусь не підключив його до цього. Дякую за пояснення!
додано Автор Matthew Read, джерело

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

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

Сподіваюсь, це допомагає комусь.

11
додано
Подивіться на мою відповідь: це вже не потрібно з Java 8.
додано Автор herman, джерело

Опублікуйте коментар кореспондента як відповідь, який може бути корисним, якщо він відображатиметься у відповідь замість коментарів.

With new versions of Mockito: (Matchers.>any()

3
додано
Я додав свій коментар до оригінальної відповіді
додано Автор Joerg, джерело

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

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

Якщо Java дозволила «загальні» генеральні ознаки, то вони могли б мати такий спосіб, який і є тим, що ви шукаєте

private static  T mock(Class> clazz)
1
додано
Не рекомендується використовувати @SuppressWarnings : pre-java 8, якщо ви збираєтеся призначити його окремому змінному, можна просто використовувати any() , як в Intoy відповісти Тепер із java 8, any() можна використовувати вбудованим без необхідності окремого призначення.
додано Автор herman, джерело
Коли я спробував це, я отримав помилку в моєму тесті: Ви не можете використовувати параметри аргументів за межами перевірки чи перевірки.
додано Автор kevinarpe, джерело
@ kevinarpe, якщо у вас є декілька параметрів аргументів, то вони повинні бути викликані для того, щоб вказати мову Java.
додано Автор TWiStErRob, джерело

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

private HashMap anyStringStringHashMap() {
    return Matchers.any();
}
0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників