Depuis quelque temps, l’article de Matthias Noback parlant de la dangerosité des bouchons apparaît régulièrement sur mon radar.

Creating test doubles is a very dangerous activity - Matthias Noback

Matthias recommande fortement dans son article de se passer des bouchons, à part pour simuler les dépendances périphériques de l’application, car il considère que dans la plupart des autres cas, ils n’apportent que des problèmes.

Or, vous aurez compris que si par le passé, j’ai pu être d’accord avec Matthias, aujourd’hui, je pense que c’est une erreur de faire cela.

En effet, un objet devrait être considéré comme une application autonome, capable de dialoguer avec d’autres applications à l’aide d’un protocole défini par son interface publique.

Et cette vision de l’objet n’est pas l’un de mes fantasmes, c’est une réalité : l’environnement d’exécution de Smalltalk est par exemple à la fois une application et un objet.

Et dans ce cas, l’ensemble des dépendances d’un objet sont donc des dépendances périphériques et elles devraient donc être systématiquement simulées par un bouchon dans les tests unitaires correspondants.

Alors certes, avec des dépendances externes telles que l’EntityManager évoqué par Matthias dans son article, cette « philosophie » peut effectivement sembler peu pertinente et peut poser beaucoup de problèmes.

Cependant, ce n’est pas le concept de bouchon qu’il faut mettre en cause dans ce cas, et encore moins son périmètre d’utilisation : il faut remettre en cause la conception de la dépendance externe (#protip à partir du moment où le développeur à besoin de savoir dans quel ordre les méthodes d’une classe doivent être appelées sur un objet pour que ce dernier fonctionne correctement, il y a un vice de conception).

La solution n’est donc pas de réserver la mise en œuvre des bouchons à quelques cas d’usages très spécifiques, mais de faire en sorte d’abstraire le service requis grâce à une interface.

Et c’est d’ailleurs la solution proposée par Matthias pour résoudre son problème avec l’EntityManager

Contrairement à Matthias, je vous recommande donc d’utiliser des bouchons systématiquement, et d’effectivement le faire pour simuler des interfaces et non des classes concrètes.