Dans ce contexte, le mot "stub" est utilisé à la place de "mock", mais par souci de clarté et de précision, l'auteur aurait dû utiliser "mock", car "mock" est une sorte de stub, mais pour les tests. Pour éviter toute confusion supplémentaire, nous devons définir ce qu'est un stub.
Dans le contexte général, un stub est un morceau de programme (typiquement une fonction ou un objet) qui encapsule la complexité de l'invocation d'un autre programme (généralement situé sur une autre machine, VM, ou processus - mais pas toujours, il peut aussi s'agir d'un objet local). Étant donné que le programme à invoquer n'est généralement pas situé dans le même espace mémoire, son invocation nécessite de nombreuses opérations telles que l'adressage, l'exécution de l'invocation à distance, la mise en forme et la sérialisation des données et des arguments à transmettre (ainsi que du résultat potentiel), voire la gestion de l'authentification et de la sécurité, etc. Notez que dans certains contextes, les stubs sont également appelés proxies (comme les proxies dynamiques en Java).
Un mock est un type de stub très spécifique et restrictif, car un mock est un remplacement d'une autre fonction ou d'un autre objet pour les tests. En pratique, nous utilisons souvent les mocks comme des programmes locaux (fonctions ou objets) pour remplacer un programme distant dans l'environnement de test. Dans tous les cas, le mock peut simuler le comportement réel du programme remplacé dans un contexte restreint.
Les types de stubs les plus connus sont évidemment destinés à la programmation distribuée, lorsqu'il faut invoquer des procédures distantes ( RPC ) ou des objets distants ( RMI , CORBA ). La plupart des cadres/librairies de programmation distribuée automatisent la génération des stubs afin que vous n'ayez pas à les écrire manuellement. Les stubs peuvent être générés à partir d'une définition d'interface, écrite à l'aide de la commande IDL par exemple (mais vous pouvez également utiliser n'importe quel langage pour définir des interfaces).
Typiquement, dans RPC, RMI, CORBA, etc., on distingue stubs côté client qui s'occupe principalement de la mise en forme et de la sérialisation des arguments et de l'exécution de l'invocation à distance, et stubs côté serveur qui se chargent principalement de démarshaler/désérialiser les arguments et d'exécuter réellement la fonction/méthode distante. Évidemment, les stubs client sont situés du côté client, tandis que les stubs serveur (souvent appelés squelettes) sont situés du côté serveur.
L'écriture de bons stubs efficaces et génériques devient assez difficile lorsqu'il s'agit de références d'objets. La plupart des cadres d'objets distribués tels que RMI et CORBA traitent les références d'objets distribués, mais c'est quelque chose que la plupart des programmeurs évitent dans les environnements REST par exemple. Typiquement, dans les environnements REST, les programmeurs JavaScript créent de simples fonctions stub pour encapsuler les invocations AJAX (la sérialisation d'objets étant supportée par JSON.parse
et JSON.stringify
). Le site Swagger Codegen fournit un support étendu pour la génération automatique de stubs REST dans différentes langues.
11 votes
Avez-vous jeté un coup d'œil à la réponse acceptée en Qu'est-ce qu'un "Stub" ? ?