Dans la documentation et les javadocs Mockito, il est dit
Il est recommandé d'utiliser ArgumentCaptor avec vérification mais pas avec stubbing.
mais je ne comprends pas comment ArgumentCaptor peut être utilisé pour le stubbing. Quelqu'un peut-il expliquer la déclaration ci-dessus et montrer comment ArgumentCaptor peut être utilisé pour le stubbing ou fournir un lien qui montre comment cela peut être fait?
java
unit-testing
junit
mockito
Je ne peux pas dire
la source
la source
Réponses:
En supposant la méthode suivante pour tester:
La documentation Mockito indique que vous ne devez pas utiliser captor de cette manière:
Parce que vous pouvez simplement utiliser matcher pendant le stubbing:
Mais la vérification est une autre histoire. Si votre test doit s'assurer que cette méthode a été appelée avec un argument spécifique, utilisez
ArgumentCaptor
et c'est le cas pour lequel elle est conçue:la source
false
pas le castrue
.La ligne
ferait la même chose que
Ainsi, utiliser argumentCaptor.capture () lors du stubbing n'a aucune valeur ajoutée. Utiliser Matchers.any () montre mieux ce qui se passe réellement et est donc meilleur pour la lisibilité. Avec argumentCaptor.capture (), vous ne pouvez pas lire quels arguments correspondent vraiment. Et au lieu d'utiliser any (), vous pouvez utiliser des matchers plus spécifiques lorsque vous avez plus d'informations (classe de l'argument attendu), pour améliorer votre test.
Et un autre problème: si vous utilisez argumentCaptor.capture () lors du stubbing, il n'est pas clair combien de valeurs vous devriez vous attendre à capturer après vérification. Nous voulons capturer une valeur pendant la vérification, pas pendant le stubbing car à ce stade, il n'y a pas encore de valeur à capturer. Alors, qu'est-ce que les capteurs d'arguments capturent la méthode de capture pendant le stubbing? ou ne capte-t-il rien? Je n'ai pas la réponse à cette question. Je considère que c'est un comportement indéfini et je ne veux pas utiliser un comportement indéfini.
la source
Hypothétiquement, si la recherche vous a amené sur cette question, vous voulez probablement ceci:
Pourquoi? Parce que comme moi, vous valorisez le temps et vous n'allez pas mettre en œuvre
.equals
uniquement pour le seul scénario de test.Et 99% des tests échouent avec null retourné de Mock et dans une conception raisonnable, vous éviteriez
null
à tout prix le retour , l'utilisationOptional
ou le déplacement vers Kotlin. Cela implique que celaverify
n'a pas besoin d'être utilisé souvent et que les ArgumentCaptors sont tout simplement trop fastidieux à écrire.la source