Еще два способа сделать это (см. Мой комментарий к предыдущему ответу @Tomasz Nurkiewicz):
Первый основан на том факте, что компилятор просто не позволит вам передать что-то неправильного типа:
when(a.method(any(Class.class))).thenReturn(b);
Вы теряете точное печатание (the Class<? extends A>
), но, вероятно, оно работает так, как вам нужно.
Второй вариант гораздо сложнее, но, возможно, это лучшее решение, если вы действительно хотите быть уверены, что аргументом method()
является A
или является подклассом A
:
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
Там , где ClassOrSubclassMatcher
приведен org.hamcrest.BaseMatcher
определяется как:
public class ClassOrSubclassMatcher<T> extends BaseMatcher<Class<T>> {
private final Class<T> targetClass;
public ClassOrSubclassMatcher(Class<T> targetClass) {
this.targetClass = targetClass;
}
@SuppressWarnings("unchecked")
public boolean matches(Object obj) {
if (obj != null) {
if (obj instanceof Class) {
return targetClass.isAssignableFrom((Class<T>) obj);
}
}
return false;
}
public void describeTo(Description desc) {
desc.appendText("Matches a class or subclass");
}
}
Уф! Я бы выбрал первый вариант, пока вам действительно не нужно получить более точный контроль над тем, что на method()
самом деле возвращает :-)
Class<?>
удивительный!