Рассмотрим этот код:
public class DummyClass {
public List<? extends Number> dummyMethod() {
return new ArrayList<Integer>();
}
}
public class DummyClassTest {
public void testMockitoWithGenerics() {
DummyClass dummyClass = Mockito.mock(DummyClass.class);
List<? extends Number> someList = new ArrayList<Integer>();
Mockito.when(dummyClass.dummyMethod()).thenReturn(someList); //Compiler complains about this
}
}
Компилятор жалуется на строку, которая пытается заглушить поведение dummyMethod()
. Есть какие-нибудь указатели на то, что делать с методами заглушки, возвращающими тип с ограниченными подстановочными знаками?
java
unit-testing
generics
mockito
bounded-wildcard
Шихар Мишра
источник
источник
Ответы:
Вы также можете использовать нетипичный безопасный метод doReturn для этой цели,
как обсуждалось в группе Google Mockito.
Хотя это проще, чем еще
thenAnswer
раз, заметьте, что это не безопасный тип. Если вы беспокоитесь о безопасности типов, ответ Millhouse будет правильным.дополнительные детали
Чтобы было ясно, вот наблюдаемая ошибка компилятора,
Я считаю, что компилятор назначил первый тип подстановочного знака во время
when
вызова, а затем не может подтвердить, что второй тип подстановочного знака вthenReturn
вызове такой же.Похоже, что
thenAnswer
эта проблема не возникает, потому что он принимает подстановочный знак, аthenReturn
не-подстановочный тип, который необходимо захватить. Из текущего стуббинга Mockito ,источник
Я предполагаю, что вы хотите быть в состоянии загрузить
someList
некоторые известные значения; Вот подход, который используетсяAnswer<T>
вместе с шаблонным вспомогательным методом для обеспечения безопасности всего типа:источник
Я ударил то же самое вчера. Оба ответа от @ nondescript1 и @millhouse помогли мне найти обходной путь. Я довольно много использовал тот же код , как @millhouse, за исключением того, что я сделал это немного более общий характер , потому что моя ошибка не была вызвана
java.util.List
, ноcom.google.common.base.Optional
. Поэтому мой маленький вспомогательный метод допускает любой тип,T
а не толькоList<T>
:С помощью этого вспомогательного метода вы можете написать:
Это прекрасно компилируется и делает то же самое, что и
thenReturn(...)
метод.Кто-нибудь знает, является ли ошибка, которую выдает компилятор Java, ошибкой компилятора или код действительно неверный?
источник
Mockito.when(dummyClass.dummyMethod()).thenAnswer(x -> someList)
таким образом, нет необходимости в служебном методеЯ превращаю комментарий фиковника в ответ, чтобы сделать его более заметным, поскольку считаю, что это наиболее элегантное решение с использованием Java 8+.
Документация Mockito рекомендует использовать
doReturn()
(как предлагается в принятом ответе) только в крайнем случае.Вместо этого для обхода ошибки компилятора, описанной в этом вопросе,
when()
можно использовать рекомендованный подход Mockito сthenAnswer()
лямбда- выражением (вместо вспомогательного метода):источник
Хотя служебный метод, предложенный Мареком Радонским, работает, есть также другой вариант, который даже не требует (ИМХО странно выглядящего) лямбда-выражения, предложенного фиковником:
Как показывает этот ответ на аналогичный вопрос, вы также можете использовать следующее:
источник