2010-06-19 5 views
6

J'essaie de tester une classe dans un code Java dont j'ai hérité.Comment tester unitairement une classe dérivée d'une classe de base avec beaucoup de dépendances?

Le problème est qu'il dérive d'une classe qui fait partie de l'application framwwork de l'entreprise. Lors de la construction, la classe de base fait toutes sortes de choses «intelligentes», en initialisant les connexions à tous les types de services nécessaires à l'exécution. Mais à des fins de tests unitaires, je n'ai pas besoin de cela. J'ai juste besoin de créer une instance de la classe dérivée et ensuite je peux l'excercer. Si un test nécessite spécifiquement une partie de la hiérarchie, je peux me moquer d'eux.

Alors, comment puis-je briser cette dépendance?

Répondre

3

Vous avez donc une classe de base et une classe étendue. Voyez si vous pouvez refactoriser la classe étendue pour ne plus étendre la classe de base, mais l'utiliser à la place. Donc, où vous avez d'abord appelé parent::fooBar(), vous appelez maintenant this.baseInstance.fooBar(). De cette façon, vous pouvez injecter une autre baseInstance à des fins de test.

Si vous avez vraiment besoin d'étendre la classe de base pour remplacer quelque chose, extrayez la fonctionnalité à une troisième classe et faites de la classe étendue un proxy. La classe étendue ne fait rien d'autre que d'appeler des méthodes sur la troisième classe. Par exemple. De cette façon, vous pouvez tester l'implémentation réelle, sans instancier la classe de base.

7

L'héritage peut être si fragile.

L'héritage est-il une exigence? Tous ces trucs "intelligents" que fait la classe de base (par exemple, établir des connexions) sont des choses qu'un moteur d'injection de dépendance fournirait normalement. Votre classe semble être mieux à la fois du point de vue du test et de l'exécution si vous trouvez un moyen de ne pas hériter et d'obtenir ses dépendances satisfaites par un moteur DI. Possible?

1

Nous avons eu un problème similaire. Beaucoup de classes de niveau et de dépendances. Nous l'avons résolu en utilisant DI

+0

Je pense que Guice est le meilleur framework DI, le printemps est aussi Java 1.4. – IAdapter

+0

Java 1.4? Avec configuration par annotation? Pas si. Il serait juste de souligner qu'il a été conçu comme une réponse aux lacunes de J2EE et EJB 2.0, mais "trop ​​Java 1.4" n'est pas correct. Guice est peut-être un bon cadre de DI, mais le printemps est bien plus que cela. C'est la persistance, la messagerie, l'accès à distance, et beaucoup plus construit sur DI et AOP. – duffymo

0

Je suis d'accord avec les autres qui suggèrent que l'injection de dépendance est la voie à suivre à long terme. Comme un hack à court terme, vous pouvez essayer d'introduire un drapeau "global" qui désactive le code d'initialisation intelligent pour le test.

Questions connexes