J'ai googlé à ce sujet, mais je n'ai rien trouvé de pertinent. J'ai quelque chose comme ça:
Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj )).thenReturn(null);
Testeable testableObj = new Testeable();
testableObj.setMockeable(mock);
command.runtestmethod();
Maintenant, je veux vérifier que mymethod(Object o)
, qui est appelé à l'intérieur runtestmethod()
, a été appelé avec l'objet o
, pas avec un autre. Mais je passe toujours le test, quoi que je mette sur la vérification, par exemple, avec:
Mockito.verify(mock.mymethod(Mockito.eq(obj)));
ou
Mockito.verify(mock.mymethod(Mockito.eq(null)));
ou
Mockito.verify(mock.mymethod(Mockito.eq("something_else")));
Je passe toujours le test. Comment puis-je effectuer cette vérification (si possible)?
Je vous remercie.
java
unit-testing
junit
mockito
manolowar
la source
la source
Essayez-vous de faire l'égalité logique en utilisant la méthode .equals de l'objet? Vous pouvez le faire en utilisant le matcher argThat inclus dans Mockito
Ensuite, vous pouvez implémenter votre propre argument matcher qui se reportera à chaque objet.
Maintenant, en utilisant votre code, vous pouvez le mettre à jour pour lire ...
Si vous optez pour l'égalité EXACT (même objet en mémoire), faites simplement
Cela vérifiera qu'il a été appelé une fois.
la source
ReflectionEquals
classe à cette fin.verify(mock).mymethod(obj);
cela ne vérifie pas l'égalité EXACTE (même objet en mémoire). Au lieu de cela, il utilise la méthode des objets égaux qui aurait pu être remplacée.ArgumentMatcher
pour être moins verbeux.verify()
invoque laequals()
méthode / de l'argument / entrant plutôt que la méthode / de l'objet / enregistréequals()
. cela n'est pas pertinent, sauf si vous essayez de confirmer que votre sujet de test renvoie une instance d'objet spécifique et que le sujet renvoie ce qui est censé être un décorateur transparent de cette instance à la place. L'verify
argumentequals()
ne connaîtrait pas le décorateur; tandis que le décorateurequals()
serait réécrit pour tolérer l'original. Dans ce cas, votre test échouera faussement.eq
matcher si vous n'utilisez pas d'autres matchers..verify(mock)
. Vous lancez maintenant la vérification sur le résultat de l'appel de méthode, sans rien vérifier (ne pas faire d'appel de méthode). Par conséquent, tous les tests réussissent.Votre code devrait ressembler à:
la source
argThat
plus lambdavoici comment échouer la vérification de votre argument:
où
argThat
plus affirmele test ci-dessus "dira"
Expected: lambda$... Was: YourClass.toSting...
. Vous pouvez obtenir une cause plus spécifique de l'échec si vous utilisez des assertions dans le lambda:MAIS: CECI NE FONCTIONNE QUE AVEC 1 APPEL DE MÉTHODE. Si la méthode vérifiée est appelée au moins 2 fois, mockito transmet toutes les combinaisons appelées à chaque vérificateur. Donc, mockito s'attend à ce que votre vérificateur retourne silencieusement
true
pour l'un des ensembles d'arguments etfalse
(sans exception d'affirmation) pour les autres appels valides. Cette attente n'est pas un problème pour 1 appel de méthode - elle devrait simplement renvoyer true 1 fois.Maintenant , le test dit:
Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
. REMARQUE: j'ai utilisé desassertJ
assertions, mais c'est à vous de choisir le cadre d'assertion à utiliser.argThat
avec plusieurs arguments.Si vous utilisez
argThat
, tous les arguments doivent être fournis avec des correspondances. Par exemple:où:
eq
matcherla façon la plus simple de vérifier si l'argument est égal:
argument direct
si la comparaison par référence est acceptable, alors continuez avec:
LA CAUSE ROOT de l' échec de la question initiale était au mauvais endroit des paranthes:
verify(mock.mymethod...
. C'était faux. Le droit serait:verify(mock).*
la source
J'ai utilisé Mockito.verify de cette manière
la source
Avez-vous vérifié la méthode equals pour la classe mockable? Si celui-ci retourne toujours vrai ou si vous testez la même instance par rapport à la même instance et que la méthode égale n'est pas remplacée (et ne vérifie donc que les références), alors elle retourne vrai.
la source
L'autre méthode consiste à utiliser la méthode org.mockito.internal.matchers.Equals.Equals au lieu d'en redéfinir une:
la source
L'avez-vous essayé avec le même () matcher? Un péché:
J'ai eu le même problème. Je l'ai essayé avec le matcher eq () ainsi que le matcher refEq () mais j'ai toujours eu des faux positifs. Lorsque j'utilisais le même correspondeur (), le test échouait lorsque les arguments étaient des instances différentes et passait une fois que les arguments étaient la même instance.
la source
Vous pouvez également utiliser TypeSafeDiagnosingMatcher
Vérifiez ensuite cette invocation:
la source