Vous avez une classe X et vous écrivez des tests unitaires qui vérifient le comportement X1. Il y a aussi la classe A qui prend X comme dépendance.
Lorsque vous écrivez des tests unitaires pour A, vous vous moquez de X. En d'autres termes, lors du test d'unité A, vous définissez (postulez) le comportement du simulacre de X sur X1. Le temps passe, les gens utilisent votre système, les besoins changent, X évolue: vous modifiez X pour afficher le comportement X2. De toute évidence, les tests unitaires pour X échoueront et vous devrez les adapter.
Mais quoi avec A? Les tests unitaires pour A n'échoueront pas lorsque le comportement de X sera modifié (en raison de la dérision de X). Comment détecter que le résultat de A sera différent s'il est exécuté avec le "réel" (modifié) X?
J'attends des réponses du type "Ce n'est pas le but des tests unitaires", mais quelle est alors la valeur des tests unitaires? Est-ce que cela vous dit vraiment seulement que lorsque tous les tests sont réussis, vous n'avez pas introduit de changement radical? Et lorsque le comportement de certaines classes change (volontairement ou non), comment pouvez-vous détecter (de préférence de manière automatisée) toutes les conséquences? Ne devrions-nous pas nous concentrer davantage sur les tests d'intégration?
X1
vous dites que X
implémente l'interface X1
. Si vous modifiez l'interface X1
par X2
le modèle que vous avez utilisé dans les autres tests ne devrait plus être compilé, vous devez donc également corriger ces tests. Les changements dans le comportement de la classe ne devraient pas importer. En fait, votre classe A
ne devrait pas dépendre des détails de l’implémentation (ce que vous changeriez dans ce cas). Les tests unitaires A
sont donc toujours corrects et vous indiquent que cela A
fonctionne si l’implémentation de l’interface est idéale.