C'est une excellente question ! Je pense que la cause profonde de cette question est la suivante : nous utilisons JUnit pas seulement pour les tests unitaires. La question devrait donc être divisée :
- Devrais-je utiliser Mockito.verify() dans mon intégration (ou tout autre test supérieur aux tests unitaires) ?
- Devrais-je utiliser Mockito.verify() dans mon boîte noire test unitaire ?
- Devrais-je utiliser Mockito.verify() dans mon boîte blanche test unitaire ?
donc si nous ignorons les tests plus élevés que les tests unitaires, la question peut être reformulée " Utilisation de boîte blanche Le test unitaire avec Mockito.verify() crée un grand couple entre le test unitaire et mon implémentation possible, puis-je faire quelques "boîte grise" le test unitaire et quelles règles empiriques je devrais utiliser pour ceci ".
Maintenant, passons en revue tout ça étape par étape.
*- Dois-je utiliser Mockito.verify() dans ma méthode de calcul de l'impact sur l'environnement ? intégration (ou tout autre test supérieur au test unitaire) ? Je pense que la réponse est clairement non, de plus vous ne devriez pas utiliser les mocks pour cela. Votre test doit être aussi proche de l'application réelle que possible. Vous testez un cas d'utilisation complet, pas une partie isolée de l'application.
* boîte noire vs boîte blanche test unitaire * Si vous utilisez boîte noire ce que vous faites réellement, vous fournissez une entrée (toutes les classes d'équivalence), une état et des tests qui vous permettront d'obtenir les résultats attendus. Dans cette approche, l'utilisation des mocks en général est justifiée (vous imitez simplement qu'ils font la bonne chose ; vous ne voulez pas les tester), mais l'appel à Mockito.verify() est superflu.
Si vous utilisez boîte blanche approche ce que vous faites vraiment, vous testez la comportement de votre unité. Dans cette approche, l'appel à Mockito.verify() est essentiel, vous devez vérifier que votre unité se comporte comme vous l'attendez.
règles d'or pour les tests de la boîte grise Le problème des tests en boîte blanche est qu'ils créent un couplage élevé. Une solution possible est de faire des tests en boîte grise, et non des tests en boîte blanche. Il s'agit en quelque sorte d'une combinaison de tests en boîte noire et en boîte blanche. Vous testez réellement la comportement de votre unité comme dans les tests en boîte blanche, mais en général, vous le rendez indépendant de l'implémentation. quand c'est possible . Lorsque c'est possible, vous ferez simplement une vérification comme dans le cas de la boîte noire, en affirmant simplement que la sortie est ce que vous attendez. Donc, l'essence de votre question est quand c'est possible.
C'est vraiment difficile. Je n'ai pas de bon exemple, mais je peux vous donner quelques exemples. Dans le cas mentionné ci-dessus avec equals() vs equalsIgnoreCase(), vous ne devriez pas appeler Mockito.verify(), mais seulement asserter la sortie. Si vous ne pouvez pas le faire, décomposez votre code en unités plus petites, jusqu'à ce que vous puissiez le faire. D'un autre côté, supposons que vous avez un @Service et que vous écrivez un @Web-Service qui est essentiellement un wrapper sur votre @Service - il délègue tous les appels au @Service (et fait quelques traitements d'erreurs supplémentaires). Dans ce cas, l'appel à Mockito.verify() est essentiel, vous ne devez pas dupliquer toutes les vérifications que vous avez faites pour le @Serive, vérifier que vous appelez le @Service avec la bonne liste de paramètres est suffisant.
1 votes
J'essaie de ne pas utiliser verify() autant que possible, pour la même raison que celle que vous avez exposée (je ne veux pas que mon test unitaire prenne connaissance de l'implémentation), mais il y a un cas où je n'ai pas le choix - les méthodes void stubbées. En général, comme elles ne renvoient rien, elles ne contribuent pas à votre résultat "réel", mais vous devez quand même savoir qu'elles ont été appelées. Mais je suis d'accord avec vous, cela n'a pas de sens d'utiliser verify pour vérifier le flux d'exécution.