Dos formas más de hacerlo (vea mi comentario sobre la respuesta anterior de @Tomasz Nurkiewicz):
El primero se basa en el hecho de que el compilador simplemente no le permitirá pasar algo del tipo incorrecto:
when(a.method(any(Class.class))).thenReturn(b);
Pierde el tipeo exacto (el Class<? extends A>
) pero probablemente funcione como lo necesita.
El segundo es mucho más complicado, pero podría decirse que es una mejor solución si realmente quieres estar seguro de que el argumento method()
es una A
o una subclase de A
:
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
Donde ClassOrSubclassMatcher
se org.hamcrest.BaseMatcher
define 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");
}
}
¡Uf! Iría con la primera opción hasta que realmente necesites tener un control más preciso sobre lo que method()
realmente regresa :-)
Class<?>
¡asombroso!