Otra opción es confiar en un buen equals
método antiguo . Mientras el argumento en el when
simulacro sea equals
el 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 someField
será el valor , puede burlarse de esta manera.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
Pros: esto es más explícito que los any
comparadores. Como revisor de código, mantengo un ojo abierto any
en 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 Answer
objeto de Mockito que se puede usar con el when
método. Answer
le permite interceptar la llamada real e inspeccionar el argumento de entrada y devolver un objeto simulado. En el siguiente ejemplo, estoy usando any
para capturar cualquier solicitud del método que se está burlando. Pero luego, en la Answer
lambda, puedo inspeccionar más el argumento de Bazo ... tal vez para verificar que se le haya pasado una identificación adecuada. Prefiero esto any
por 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 Answer
inspeccionar el argumento.