tutorial mock examples example español java class generics mocking mockito

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();