java - examples - mockito tutorial español
Anulando un método que toma Class<T> como parámetro con Mockito (3)
Hay un método genérico que toma una clase como parámetro y tengo problemas para anotarlo con Mockito. El método se ve así:
public <U extends Enum<U> & Error, T extends ServiceResponse<U>> T validate(
Object target, Validator validator, Class<T> responseClass,
Class<U> errorEnum);
Es horrible, al menos para mí ... Podría imaginar vivir sin él, pero el resto del código lo usa felizmente ...
Iba a hacer, en mi prueba unitaria, este método para devolver un nuevo objeto vacío. ¿Pero cómo hago esto con mockito? Lo intenté:
when(serviceValidatorStub.validate(
any(),
isA(UserCommentRequestValidator.class),
UserCommentResponse.class,
UserCommentError.class)
).thenReturn(new UserCommentResponse());
pero dado que estoy mezclando y combinando matchers y valores en bruto, obtengo "org.mockito.exceptions.misusing.InvalidUseOfMatchersException: uso no válido de argumentos matchers!"
Bonito @Ash. Utilicé tu clasificador de clase genérico para preparar a continuación. Esto se puede usar si queremos preparar un simulacro de un tipo específico. (No instancia)
private Class<StreamSource> streamSourceClass() {
return Mockito.argThat(new ArgumentMatcher<Class<StreamSource>>() {
@Override
public boolean matches(Object argument) {
// TODO Auto-generated method stub
return false;
}
});
}
Uso:
Mockito.when(restTemplate.getForObject(Mockito.anyString(),
**streamSourceClass(),**
Mockito.anyObject));
El problema es que no se pueden mezclar los argumentos de los argumentos y los argumentos reales en una llamada burlada. Entonces, más bien haz esto:
when(serviceValidatorStub.validate(
any(),
isA(UserCommentRequestValidator.class),
eq(UserCommentResponse.class),
eq(UserCommentError.class))
).thenReturn(new UserCommentResponse());
Observe el uso de la coincidencia de argumentos eq()
para igualar la igualdad.
ver: https://static.javadoc.io/org.mockito/mockito-core/1.10.19/org/mockito/Matchers.html#eq(T)
Además, podría usar el same()
argumento matcher para Class<?>
Tipos - esto coincide con la misma identidad, como el ==
operador de Java.
Solo para completar el mismo hilo, si alguien quiere anular un método que toma una Clase como argumento, pero no le importa el tipo, o necesita muchos tipos para ser anulados de la misma manera, aquí hay otra solución:
private class AnyClassMatcher extends ArgumentMatcher<Class<?>> {
@Override
public boolean matches(final Object argument) {
// We always return true, because we want to acknowledge all class types
return true;
}
}
private Class<?> anyClass() {
return Mockito.argThat(new AnyClassMatcher());
}
y luego llamar
Mockito.when(mock.doIt(this.anyClass())).thenCallRealMethod();