Mais duas maneiras de fazer isso (veja meu comentário na resposta anterior de @Tomasz Nurkiewicz):
O primeiro baseia-se no fato de que o compilador simplesmente não permite que você passe algo do tipo errado:
when(a.method(any(Class.class))).thenReturn(b);
Você perde a digitação exata (o Class<? extends A>
), mas provavelmente funciona como você precisa.
O segundo é muito mais envolvido, mas é sem dúvida uma solução melhor se você realmente quiser ter certeza de que o argumento para method()
é uma A
ou uma subclasse de A
:
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
Onde ClassOrSubclassMatcher
é org.hamcrest.BaseMatcher
definido como:
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");
}
}
Ufa! Eu usaria a primeira opção até que você realmente precise obter um controle mais preciso sobre o que method()
realmente retorna :-)
Class<?>
surpreendente!