web-dev-qa-db-fra.com

Se moquer d'une classe ou se moquer de son interface

Pour un test unitaire, j'ai besoin de se moquer de plusieurs dépendances. L'une des dépendances est une classe qui implémente une interface:

public class DataAccessImpl implements DataAccess {
    ...
}

J'ai besoin de mettre en place un objet factice de cette classe qui retourne certaines valeurs spécifiées lorsqu'il est fourni avec certains paramètres spécifiés.

Maintenant, ce dont je ne suis pas sûr, c'est s'il vaut mieux se moquer de l'interface ou de la classe, c'est-à-dire.

DataAccess client = mock(DataAccess.class);

vs.

DataAccess client = mock(DataAccessImpl.class);

Cela fait-il une différence en ce qui concerne les tests? Quelle serait l'approche préférée?

40
helpermethod

Cela peut ne pas faire beaucoup de différence dans votre cas, mais l'approche préférée est de simuler l'interface, comme normalement si vous suivez TDD (Test Driven Development), vous pouvez écrire vos tests unitaires avant même d'écrire vos classes d'implémentation. Ainsi, même si vous n'aviez pas de classe concrète DataAccessImpl, vous pourriez toujours écrire des tests unitaires en utilisant votre interface DataAccess.

De plus, les frameworks de simulation ont des limitations dans les classes de simulation, et certains frameworks ne modifient que les interfaces par défaut.

45
Kuldeep Jain

Ça dépend. Si votre code dépend de la classe et non de l'interface, vous devez vous moquer de la classe pour écrire un test unitaire valide.

6
onof

Dans la plupart des cas, techniquement, il n'y a aucune différence et vous pouvez vous moquer en tant que classe, donc d'une interface. Conceptuellement, il est préférable d'utiliser des interfaces en raison d'une meilleure abstraction.

6
Alex Nikolaenkov

Vous devez vous moquer de l'interface car cela vous aidera à vous assurer que vous adhérez au principal de substitution de Liskov ( https://stackoverflow.com/a/56904/35711 ).

3
jordan

Si vous ne l'utilisez que via l'interface et que ce n'est pas une simulation partielle, il n'y a pas de différence autre que votre sentiment intérieur. Se moquer de la classe se moquera également de la méthode publique non utilisée si la classe en a, mais ce n'est pas un gros problème à considérer.

2
Alex Abdugafarov