Tengo una firma de la función que me gustaría burlarse de un servicio externo.
public <T> void save(T item, AnotherClass anotherClassObject);
Teniendo en cuenta esta firma de la función, y el nombre de la clase IGenericService
, ¿cómo podría uno burlarse con PowerMock? O Mockito?
Por esta genérico, que estoy usando: Clase Theodore
de la T en T item
. Por ejemplo, he intentado usar:
doNothing().when(iGenericServiceMock.save(any(Theodore.class),
any(AnotherClass.class));
IntelliJ bielas a esto:
save(T, AnotherClass) cannot be applied to
(org.Hamcrest.Matcher<Theodore>, org.Hamcrest.Matcher<AnotherClass>)
Y cita el siguiente motivo:
reason: No instance(s) of type variable T exist
so that Matcher<T> conforms to AnotherClass
En primer lugar, la cuestión debe resolver si el argumento genéricos se maneja adecuadamente. ¿Cuáles son algunas cosas que uno podría hacer en este tipo de situaciones?
ACTUALIZACIÓN: Como compartida ETO:
doNothing().when(mockedObject).methodToMock(argMatcher);
comparte el mismo destino.
Usted está de paso de parámetros incorrectos when
. Puede ser un poco confuso, pero hay dos usos diferentes de when
método (en realidad estos son dos métodos diferentes):
when(mockedObject.methodYouWantToMock(expectedParameter, orYourMatcher)).thenReturn(objectToReturn);
doReturn(objectToReturn).when(mockedObject).methodYouWantToMock(expectedParameter, orYourMatcher);
Nota: prestar atención a los parámetros de entrada del when
método en ambos casos .
En su caso particular, se podría hacer algo como esto:
doReturn(null).when(iGenericServiceMock).save(any(Theodore.class), any(AnotherClass.class));
Esto solucionará sus problemas de compilación. Sin embargo, la prueba fallará en tiempo de ejecución org.mockito.exceptions.misusing.CannotStubVoidMethodWithReturnValue
, ya que están tratando de devolver algo a partir de un void
método ( null
no es void
). Lo que debe hacer es:
doNothing().when(iGenericServiceMock).save(any(Theodore.class), any(AnotherClass.class));
Más tarde se puede comprobar las interacciones con su maqueta usando verify
el método.
ACTUALIZAR:
Revisar sus importaciones. Debe utilizar org.mockito.Matchers.any
en lugar de org.hamcrest.Matchers.any
.