Une autre option consiste à s'appuyer sur une bonne equalsméthode à l' ancienne . Tant que l'argument dans la whenmaquette est equalsl'argument dans le code testé, alors Mockito correspondra à la maquette.
Voici un exemple.
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 );
}
}
puis, en supposant que vous savez quelle sera la valeur someField, vous pouvez vous en moquer comme ceci.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
avantages: C'est plus explicite que les anymatchers. En tant que réviseur de code, je garde un œil ouvert anydans l'écriture de code pour les développeurs juniors, car il jette un coup d'œil sur la logique de leur code pour générer l'objet approprié transmis.
con: Parfois, le champ transmis à l'objet est un ID aléatoire. Dans ce cas, vous ne pouvez pas facilement construire l'objet argument attendu dans votre code maquette.
Une autre approche possible consiste à utiliser l' Answerobjet de Mockito qui peut être utilisé avec la whenméthode. Answervous permet d'intercepter l'appel réel, d'inspecter l'argument d'entrée et de renvoyer un objet factice. Dans l'exemple ci-dessous, j'utilise anypour intercepter toute demande concernant la méthode à moquer. Mais ensuite, dans le Answerlambda, je peux inspecter davantage l'argument Bazo ... peut-être pour vérifier qu'une ID appropriée lui a été transmise. Je préfère cela anypar lui-même afin qu'au moins une certaine inspection soit faite sur l'argument.
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;
} );
Donc, pour résumer le tout, j'aime me baser sur equals(où l'argument attendu et l'argument réel doivent être égaux) et si l'égalité n'est pas possible (en raison de ne pas pouvoir prédire l'état de l'argument réel), je vais recourir pour Answerinspecter l'argument.