La question « comment test unitaire une classe abstraite? » revient très fréquemment. Vous étendre, puis remplacer les méthodes abstraites avec talons et puis tester uniquement la partie concrète de la méthode ? Ou élaborer un test unitaire abstraite ?
Nous pensons que c'est probablement la mauvaise question à poser quand il s'agit de classes abstraites. Nous pensons en effet il est un bon moyen d'éviter le problème complètement. Si l'on considère un abrégé base classe il sont vraiment deux méthodes standard approchant cela :
Le premier est où vous avez besoin de se spécialiser un objet abstrait. Dans ce cas, vous trouverez très certainement que les clients ont besoin d'utiliser la classe abstraite que vous créez via une interface de base.
Dans le second cas, vous construisez la classe abstraite pour tenter de réduire les doubles emplois. Dans ce cas, vous verrez rapidement que les clients accèdent en fait des versions concrètes de la classe lorsqu'ils y accéder via une interface.
Un changement dans l'approche du développement des tests logiciels
Si vous prenez la première méthode ci-dessus, alors vous avez déjà une interface qui est été entièrement définie. C'est à travers le processus des méthodes virtuelles à l'intérieur des classes mis en œuvre par vos classes dérivées nouvellement. Pourquoi ne pas faire qu'une réelle interface de l'interface ? Vous échanger la classe abstraite pour un béton. Puis prendre un instantané de la nouvelle interface du constructeur. Toutes vos classes dérivées peuvent ensuite utiliser l'interface réelle.
Cela fait tester la classe abstraite simple. Vous venez d'utilisez une maquette de l'interface et travaillez à travers les implémentations supplémentaires à l'aide de ce qui est maintenant une réelle interface.
Pour la seconde méthode, cela fonctionne déjà comme une classe d'assistance. Vous pouvez examiner les fonctionnalités au sein de cette classe abstraite et essayer de travail dans les objets que vous manipulez. Si vous trouvez il y a encore des matériaux au sein de ces classes lorsque c'est fini - il faire une classe d'assistance dans le constructeur (n'oubliez pas d'emporter de la classe de base) et c'est une implémentation concrète. C'est beaucoup plus facile de tester un résumé.
Il est possible de combiner les méthodes 1 et 2, et nous avons constaté que le meilleur moyen d'approche qui consiste à utiliser l'approche de la seconde méthode et puis tout simplement prendre l'arborescence d'héritage et le convertir en un modèle de stratégie.
La meilleure façon de l'essai les classes abstraites est simplement de réduire la classe en quelque chose de plus facile à manipuler.