Je travaille à rendre mes classes testables à l'unité, en utilisant l'injection de dépendance. Mais certaines de ces classes ont beaucoup de clients, et je ne suis pas encore prêt à les refactoriser pour commencer à passer dans les dépendances. J'essaie donc de le faire progressivement; en conservant les dépendances par défaut pour l'instant, mais en les autorisant à être remplacées pour les tests.
Une approche que je conise consiste simplement à déplacer tous les «nouveaux» appels dans leurs propres méthodes, par exemple:
public MyObject createMyObject(args) {
return new MyObject(args);
}
Ensuite, dans mes tests unitaires, je peux simplement sous-classer cette classe et remplacer les fonctions de création, afin qu'elles créent de faux objets à la place.
Est-ce une bonne approche? Y a-t-il des inconvénients?
Plus généralement, est-il acceptable d'avoir des dépendances codées en dur, tant que vous pouvez les remplacer pour les tests? Je sais que l'approche préférée est de les exiger explicitement dans le constructeur, et j'aimerais y arriver éventuellement. Mais je me demande si c'est une bonne première étape.
Un inconvénient qui m'est venu à l'esprit: si vous avez de vraies sous-classes que vous devez tester, vous ne pouvez pas réutiliser la sous-classe de test que vous avez écrite pour la classe parente. Vous devrez créer une sous-classe de test pour chaque sous-classe réelle, et elle devra remplacer les mêmes fonctions de création.