Outra opção é confiar no bom equals
método à moda antiga . Enquanto o argumento no when
mock equals
o 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 any
correspondentes. Como revisor de código, fico de olho any
no 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 Answer
objeto de Mockito que pode ser usado com o when
método Answer
permite interceptar a chamada real e inspecionar o argumento de entrada e retornar um objeto simulado. No exemplo abaixo, estou usando any
para capturar qualquer solicitação para o método que está sendo ridicularizado. Mas então, no Answer
lambda, posso inspecionar ainda mais o argumento Bazo ... talvez para verificar se um ID adequado foi passado para ele. Prefiro isso any
por 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 Answer
inspecionar o argumento.