¿Hay alguna manera de hacer coincidir algún argumento de clase de la rutina de muestra a continuación?
class A {
public B method(Class<? extends A> a) {}
}
¿Cómo puedo devolver siempre un new B()
independientemente de en qué clase se pasa method
? El siguiente intento solo funciona para el caso específico donde A
coincide.
A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);
EDITAR : Una solución es
(Class<?>) any(Class.class)
Class<?>
¡asombroso!Respuestas:
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:
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 unaA
o una subclase deA
:Donde
ClassOrSubclassMatcher
seorg.hamcrest.BaseMatcher
define como:¡Uf! Iría con la primera opción hasta que realmente necesites tener un control más preciso sobre lo que
method()
realmente regresa :-)fuente
if (obj instanceof Class)
arruina las cosas, así que lo eliminé.extends BaseMatcher<Class<T>>
a justoextends BaseMatcher<T>
. Solo para tu información, si alguien más obtiene errores de compilación, pruébalo.matches
función a la siguiente:public boolean matches(Object obj) { if (obj != null) { return targetClass.isAssignableFrom(obj.getClass()); } return false; }
Hay otra forma de hacerlo sin yeso:
Esta solución obliga al método
any()
a devolver elClass<A>
tipo y no su valor predeterminado (Object
).fuente
Matchers
está en desuso en las versiones más recientes de Mockito y probablemente se eliminará en la versión 3.0. Utilice en suArgumentMatchers
lugar:when(a.method(ArgumentMatchers.<Class<A>>any())).thenReturn(b);
Si no tiene idea de qué paquete necesita importar:
O
fuente
org.mockito.ArgumentMatchers.any
Qué tal si:
o:
fuente
method(A a)
, pero es (efectivamente)method(Class<A> a)
, por lo que necesitaría usar:when(a.method(isA(Class.class))).thenReturn(b);
owhen(a.method((Class<A>) notNull())).thenReturn(b);
la solución de millhouse ya no funciona con la versión reciente de mockito
Esta solución funciona con Java 8 y Mockito 2.2.9
donde
ArgumentMatcher
es una instancia deorg.mockito.ArgumentMatcher
Y el uso
fuente
public static <T> Class<T> subClassOf(Class<T> targetClass) { return argThat(new ClassOrSubclassMatcher<>(targetClass)); }