Ще два способи зробити це (дивіться мій коментар до попередньої відповіді від @Tomasz Nurkiewicz):
Перший покладається на те, що компілятор просто не дозволить вам передати щось неправильне:
when(a.method(any(Class.class))).thenReturn(b);
Ви втрачаєте точне введення тексту ( 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<?>
дивовижний!