Zwei weitere Möglichkeiten (siehe meinen Kommentar zur vorherigen Antwort von @Tomasz Nurkiewicz):
Der erste beruht auf der Tatsache, dass der Compiler Sie einfach nicht zulässt, dass etwas vom falschen Typ übergeben wird:
when(a.method(any(Class.class))).thenReturn(b);
Sie verlieren die genaue Eingabe (die Class<? extends A>), aber es funktioniert wahrscheinlich so, wie Sie es brauchen.
Die zweite ist viel komplizierter, aber wahrscheinlich eine bessere Lösung, wenn Sie wirklich sicher sein möchten, dass das Argument method()eine Aoder eine Unterklasse von A:
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
Wo ClassOrSubclassMatcherist ein org.hamcrest.BaseMatcherdefiniert als:
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");
}
}
Puh! Ich würde mit der ersten Option gehen, bis Sie wirklich eine genauere Kontrolle darüber bekommen müssen, was method()tatsächlich zurückkommt :-)
Class<?>tolle!