Une autre option consiste à s'appuyer sur une bonne equals
méthode à l' ancienne . Tant que l'argument dans la when
maquette est equals
l'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 any
matchers. En tant que réviseur de code, je garde un œil ouvert any
dans 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' Answer
objet de Mockito qui peut être utilisé avec la when
méthode. Answer
vous 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 any
pour intercepter toute demande concernant la méthode à moquer. Mais ensuite, dans le Answer
lambda, 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 any
par 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 Answer
inspecter l'argument.