Otra opción es confiar en un buen equalsmétodo antiguo . Mientras el argumento en el whensimulacro sea equalsel argumento en el código que se está probando, entonces Mockito coincidirá con el simulacro.
Aquí hay un ejemplo.
public class MyPojo {
public MyPojo( String someField ) {
this.someField = someField;
}
private String someField;
@Override
public boolean equals( Object o ) {
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;
MyPojo myPojo = ( MyPojo ) o;
return someField.equals( myPojo.someField );
}
}
luego, suponiendo que sepa cuál someFieldserá el valor , puede burlarse de esta manera.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
Pros: esto es más explícito que los anycomparadores. Como revisor de código, mantengo un ojo abierto anyen el código que escriben los desarrolladores junior, ya que echa un vistazo a la lógica de su código para generar el objeto apropiado que se pasa.
con: a veces el campo que se pasa al objeto es una ID aleatoria. Para este caso, no puede construir fácilmente el objeto de argumento esperado en su código simulado.
Otro enfoque posible es usar el Answerobjeto de Mockito que se puede usar con el whenmétodo. Answerle permite interceptar la llamada real e inspeccionar el argumento de entrada y devolver un objeto simulado. En el siguiente ejemplo, estoy usando anypara capturar cualquier solicitud del método que se está burlando. Pero luego, en la Answerlambda, puedo inspeccionar más el argumento de Bazo ... tal vez para verificar que se le haya pasado una identificación adecuada. Prefiero esto anypor sí solo para que al menos se realice una inspección sobre el argumento.
Bar mockBar = //generate mock Bar.
when(fooDao.getBar(any(Bazo.class))
.thenAnswer( ( InvocationOnMock invocationOnMock) -> {
Bazo actualBazo = invocationOnMock.getArgument( 0 );
//inspect the actualBazo here and thrw exception if it does not meet your testing requirements.
return mockBar;
} );
Entonces, para resumir todo, me gusta confiar en equals(donde el argumento esperado y el argumento real deberían ser iguales entre sí) y si igual no es posible (debido a que no puedo predecir el estado del argumento real), recurriré para Answerinspeccionar el argumento.