Outra opção é confiar no bom equalsmétodo à moda antiga . Enquanto o argumento no whenmock equalso argumento no código sendo testado, o Mockito corresponderá ao mock.
Aqui está um exemplo.
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 );
}
}
supondo que você saiba qual será o valor someField, você pode zombar assim.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
prós: isso é mais explícito que os anycorrespondentes. Como revisor de código, fico de olho anyno código que os desenvolvedores juniores escrevem, pois olha a lógica do código para gerar o objeto apropriado que está sendo passado.
con: Às vezes, o campo que está sendo passado para o objeto é um ID aleatório. Nesse caso, você não pode construir facilmente o objeto de argumento esperado no seu código simulado.
Outra abordagem possível é usar o Answerobjeto de Mockito que pode ser usado com o whenmétodo Answerpermite interceptar a chamada real e inspecionar o argumento de entrada e retornar um objeto simulado. No exemplo abaixo, estou usando anypara capturar qualquer solicitação para o método que está sendo ridicularizado. Mas então, no Answerlambda, posso inspecionar ainda mais o argumento Bazo ... talvez para verificar se um ID adequado foi passado para ele. Prefiro isso anypor si só, para que pelo menos alguma inspeção seja feita no 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;
} );
Então, para resumir tudo, eu gosto de confiar equals(onde o argumento esperado e o argumento real devem ser iguais um ao outro) e se igual não for possível (devido à incapacidade de prever o estado real do argumento), vou recorrer para Answerinspecionar o argumento.