Есть ли способ сопоставить какой-либо аргумент класса из приведенной ниже примерной процедуры?
class A {
public B method(Class<? extends A> a) {}
}
Как я всегда могу вернуть new B()
независимо от того, в какой класс передается method
? Следующая попытка работает только для конкретного случая, где A
сопоставляется.
A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);
РЕДАКТИРОВАТЬ : одно решение
(Class<?>) any(Class.class)
Class<?>
удивительный!Ответы:
Еще два способа сделать это (см. Мой комментарий к предыдущему ответу @Tomasz Nurkiewicz):
Первый основан на том факте, что компилятор просто не позволит вам передать что-то неправильного типа:
Вы теряете точное печатание (the
Class<? extends A>
), но, вероятно, оно работает так, как вам нужно.Второй вариант гораздо сложнее, но, возможно, это лучшее решение, если вы действительно хотите быть уверены, что аргументом
method()
являетсяA
или является подклассомA
:Там , где
ClassOrSubclassMatcher
приведенorg.hamcrest.BaseMatcher
определяется как:Уф! Я бы выбрал первый вариант, пока вам действительно не нужно получить более точный контроль над тем, что на
method()
самом деле возвращает :-)источник
if (obj instanceof Class)
портит вещи для меня, так что я удалил его.extends BaseMatcher<Class<T>>
на простоextends BaseMatcher<T>
. Просто к сведению, если кто-то еще получит ошибки компиляции, попробуйте это.matches
функцию на следующее:public boolean matches(Object obj) { if (obj != null) { return targetClass.isAssignableFrom(obj.getClass()); } return false; }
Есть другой способ сделать это без приведения:
Это решение заставляет метод
any()
возвращатьClass<A>
тип, а не его значение по умолчанию (Object
).источник
Matchers
устарела в новых версиях Mockito и, вероятно, будет удалена в версии 3.0. ИспользуйтеArgumentMatchers
вместо этого:when(a.method(ArgumentMatchers.<Class<A>>any())).thenReturn(b);
Если вы не знаете, какой пакет вам нужно импортировать:
ИЛИ
источник
org.mockito.ArgumentMatchers.any
Как насчет:
или:
источник
method(A a)
- но это (эффективно)method(Class<A> a)
- так что вам нужно было бы использовать:when(a.method(isA(Class.class))).thenReturn(b);
илиwhen(a.method((Class<A>) notNull())).thenReturn(b);
Решение от Millhouse больше не работает с последней версией Mockito
Это решение работает с Java 8 и Mockito 2.2.9
где
ArgumentMatcher
экземплярorg.mockito.ArgumentMatcher
И использование
источник
public static <T> Class<T> subClassOf(Class<T> targetClass) { return argThat(new ClassOrSubclassMatcher<>(targetClass)); }