Avant-propos
Il existe plusieurs définitions d'objets, qui ne sont pas réels. Le terme général est test double . Ce terme englobe : factice , faux , talon , simuler .
Référence
Selon L'article de Martin Fowler :
-
Dummy Les objets sont transmis mais ne sont jamais utilisés. En général, ils sont juste utilisés pour remplir les listes de paramètres.
-
Faux ont en fait des implémentations fonctionnelles, mais prennent généralement un raccourci qui les rend inadaptés à la production (une base de données en mémoire en est un bon exemple).
-
Stubs fournissent des réponses toutes faites aux appels effectués pendant le test, et ne répondent généralement pas du tout à ce qui n'est pas programmé pour le test. Les stubs peuvent également enregistrer des informations sur les appels, comme un stub de passerelle de messagerie qui se souvient des messages qu'il a "envoyés", ou peut-être seulement du nombre de messages qu'il a "envoyés".
-
Mocks sont ce dont nous parlons ici : des objets préprogrammés avec des attentes qui constituent une spécification des appels qu'ils sont censés recevoir.
Style
Mocks vs Stubs = Tests comportementaux vs tests d'état
Principe
Selon le principe de Ne testez qu'un seul élément par test Dans les tests, il peut y avoir plusieurs stubs dans un test, mais généralement il n'y a qu'un seul mock.
Cycle de vie
Cycle de vie des tests avec les stubs :
- Setup - Préparer l'objet qui est testé et ses collaborateurs stubs.
- Exercice - Tester la fonctionnalité.
- Vérifier l'état - Utiliser les assertions pour vérifier l'état de l'objet.
- Démontage - Nettoyer les ressources.
Cycle de vie des tests avec les mocks :
- Données de préparation - Préparer l'objet qui est testé.
-
Définir les attentes - Préparez les attentes dans l'objet fictif qui est utilisé par l'objet primaire.
- Exercice - Tester la fonctionnalité.
-
Vérifier les attentes - Vérifier que les méthodes correctes ont été invoquées dans l'objet fantaisie.
- Vérifier l'état - Utiliser les assertions pour vérifier l'état de l'objet.
- Démontage - Nettoyer les ressources.
Résumé
Les tests mocks et stubs donnent tous deux une réponse à la question : Quel est le résultat ?
Les tests avec des mocks sont également intéressés par : Comment le résultat a-t-il été atteint ?
5 votes
Duplicata possible de Un aperçu de la terminologie des tests unitaires (stub vs mock, intégration vs interaction) ? , Quelle est la différence entre faire semblant de se moquer et trafiquer
118 votes
@OP Parce qu'il n'y a pas de différence. Cet article, bien qu'aimé par la communauté, rend - avec tout le respect que je lui dois - tout ce qui est inutile confus en ajoutant un sens supplémentaire à des mots qui sont faciles à comprendre autrement et en rendant les choses inutilement compliquées. L'objet fantaisie n'est qu'un objet fantaisie, quelque chose qui exécute une fausse logique d'entreprise au lieu d'une vraie. La vérification du comportement à la fin est votre choix, mais c'est toujours un simulacre. Ou appelez-le comme vous voulez, mais faites-en UNE. Ne coupez pas les cheveux en quatre. Restez simple, afin que les gens puissent comprendre votre concept facilement - ce que l'article ci-dessus ne fait pas.
17 votes
"La classification entre mocks, fakes et stubs est très incohérente dans la littérature." Avec de nombreuses citations. Toujours une de mes citations Wikipedia préférées - si une telle chose existe :) fr.wikipedia.org/wiki/Mock_object
23 votes
Que l'article de Martin Fowler est vraiment difficile à comprendre pour les débutants.
1 votes
Duplicata possible de Quelle est la différence entre faire semblant, se moquer et buter ?
1 votes
De la façon dont je le comprends, un stub serait juste un objet jetable pour votre test, comme une collection de données factices. Un Mock serait une version habilement surchargée de quelque chose de plus complexe, comme une couche de service avec diverses méthodes, dont vous pourriez avoir changé le comportement, pour vos tests. Les deux choses sont utilisées ensemble, comme vous pourriez passer des objets "stubbed" dans votre couche "mocked".
0 votes
Jusqu'à présent, je ne veux toujours pas faire de distinction entre ces définitions. Essentiellement, ce que la plupart des gens veulent, c'est isoler leurs dépendances (ou simuler un retour) dans les tests. Si je comprends l'importance de cette petite différence, je l'écrirai.
1 votes
@wst Il est vrai que la différence de terminologie est vraiment inutile. est une réponse crédible . Comme si tout ce dont vous aviez besoin était des tests + mocks/remplacements/subs/dummies/quelque chose qui fait le travail. C'est juste que parfois vous avez besoin d'affirmer si quelque chose dans l'objet fantaisie vient d'être appelé (par opposition aux fois où vous ne le faites pas) - sans valider/tester le comportement de l'objet fantaisie. Et avoir des noms variés pour de telles choses n'a aucun sens pour le développeur. C'est un véritable fouillis. J'écris des tests unitaires depuis des années et tout ce qui m'intéresse est la différence entre
Foo
classe,FooTests
,FooMock
.