Mockito/Hamcrest и общие классы
Да, это общая проблема с Mockito/Hamcrest. Обычно использование isA()
с универсальными классами приводит к предупреждению.
Существуют предопределенные средства сопоставления Mockito для наиболее распространенных универсальных классов: любой список(), anyMap()
, anySet()
и anyCollection()
.
Предложения:
anyIterable() в Mockito 2.1.0
В Mockito 2.1.0 добавлен новый anyIterable() метод сопоставления итерируемых объектов:
when(client.runTask(anyString(), anyString(), anyIterable()).thenReturn(...)
Игнорировать в Eclipse
Если вы просто хотите избавиться от предупреждения в Eclipse. Вариант существует с Затмение Индиго:
Окно > Настройки > Java > Компилятор > Ошибки/Предупреждения > Общие типы > Игнорировать неизбежные проблемы универсального типа
Быстрое исправление с помощью @SuppressWarnings
Я предлагаю вам сделать это, если у вас возникла проблема только один раз. Лично я не помню, чтобы когда-нибудь нуждался в isA(Iterable.class)
.
Как говорит Дэниел Прайден, вы можете ограничить @SuppressWarnings
локальной переменной или вспомогательным методом.
Используйте общий сопоставитель isA() с TypeToken
Это решает проблему навсегда. Но у него есть два недостатка:
- Синтаксис не слишком красивый и может запутать некоторых людей.
- У вас есть дополнительная зависимость от библиотеки, предоставляющей класс
TypeToken
. Здесь я использовал класс TypeToken из Гуава. Также есть класс TypeToken
в Gson и GenericType
в JAX-RS.
Использование универсального сопоставителя:
import static com.arendvr.matchers.InstanceOfGeneric.isA;
import static org.mockito.ArgumentMatchers.argThat;
// ...
when(client.runTask(anyString(), anyString(), argThat(isA(new TypeToken<Iterable<Integer>>() {}))))
.thenReturn(...);
Общий класс сопоставления:
package com.arendvr.matchers;
import com.google.common.reflect.TypeToken;
import org.mockito.ArgumentMatcher;
public class InstanceOfGeneric<T> implements ArgumentMatcher<T> {
private final TypeToken<T> typeToken;
private InstanceOfGeneric(TypeToken<T> typeToken) {
this.typeToken = typeToken;
}
public static <T> InstanceOfGeneric<T> isA(TypeToken<T> typeToken) {
return new InstanceOfGeneric<>(typeToken);
}
@Override
public boolean matches(Object item) {
return item != null && typeToken.getRawType().isAssignableFrom(item.getClass());
}
}
person
Arend v. Reinersdorff
schedule
18.08.2012