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 A
oder eine Unterklasse von A
:
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
Wo ClassOrSubclassMatcher
ist ein org.hamcrest.BaseMatcher
definiert 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!