Есть ли чистый метод насмешки над классом с общими параметрами? Скажем, я должен смоделировать класс, Foo<T>
который мне нужно передать в метод, который ожидает Foo<Bar>
. Я могу сделать следующее достаточно легко:
Foo mockFoo = mock(Foo.class);
when(mockFoo.getValue).thenReturn(new Bar());
Предполагая, getValue()
возвращает универсальный тип T
. Но это будет иметь котят, когда я позже передам это в метод ожидания Foo<Bar>
. Является ли кастинг единственным средством сделать это?
Еще один способ обойти это - использовать
@Mock
аннотацию. Не работает во всех случаях, но выглядит намного сексуальнее :)Вот пример:
MockitoJUnitRunner
Инициализирует поля аннотированные с@Mock
.источник
SuppressWarnings
. Предупреждения существуют по причине, лучше не иметь привычки подавлять их. Спасибо!@Mock
вместоmock()
: поля все еще являются пустыми во время построения, поэтому я не могу вставлять зависимости в это время и не могу сделать поля окончательными. Первый может быть решен с помощью@Before
аннотированного метода, конечно.Вы всегда можете создать промежуточный класс / интерфейс, который будет удовлетворять универсальному типу, который вы хотите указать. Например, если Foo был интерфейсом, вы можете создать следующий интерфейс в своем тестовом классе.
В ситуациях, когда Foo не является финальным классом, вы можете просто расширить класс следующим кодом и сделать то же самое:
Тогда вы можете использовать любой из приведенных выше примеров с помощью следующего кода:
источник
Foo
что это интерфейс или не финальный класс, это представляется довольно элегантным решением. Спасибо.Создайте метод тестовой утилиты . Особенно полезно, если вам это нужно более одного раза.
источник
static <T> T genericMock(Class<? super T> classToMock) { return (T)mock(classToMock); }
это даже не нуждается в единственном подавлении :) Но будьте осторожны,Integer num = genericMock(Number.class)
компилируйте, но бросайтеClassCastException
. Это полезно только для наиболее распространенногоG<P> mock = mock(G.class)
случая.Я согласен с тем, что не следует подавлять предупреждения в классах или методах, поскольку можно пропустить другие, случайно подавленные предупреждения. Но ИМХО абсолютно разумно подавить предупреждение, которое затрагивает только одну строку кода.
источник
Вот интересный случай: метод получает универсальную коллекцию и возвращает универсальную коллекцию того же базового типа. Например:
Этот метод может быть смоделирован с помощью сочетания Mockito anyCollectionOf и Ответа.
источник