Je travaille sur un projet où les appels internes de classe sont habituels mais les résultats sont souvent des valeurs simples. Exemple ( pas de vrai code ):
public boolean findError(Set<Thing1> set1, Set<Thing2> set2) {
if (!checkFirstCondition(set1, set2)) {
return false;
}
if (!checkSecondCondition(set1, set2)) {
return false;
}
return true;
}
L'écriture de tests unitaires pour ce type de code est vraiment difficile car je veux juste tester le système de conditions et non l'implémentation des conditions réelles. (Je le fais dans des tests séparés.) En fait, il serait préférable de passer des fonctions qui implémentent les conditions et dans les tests, je fournis simplement des simulations. Le problème avec cette approche est le bruit: nous utilisons beaucoup de génériques .
Une solution de travail; cependant, il faut faire de l'objet testé un espion et se moquer des appels aux fonctions internes.
systemUnderTest = Mockito.spy(systemUnderTest);
doReturn(true).when(systemUnderTest).checkFirstCondition(....);
Le problème ici est que l'implémentation du SUT est effectivement modifiée et il peut être problématique de garder les tests synchronisés avec l'implémentation. Est-ce vrai? Existe-t-il une meilleure pratique pour éviter ce ravage d'appels de méthode interne?
Notez que nous parlons de parties d'un algorithme, donc le répartir en plusieurs classes peut ne pas être une décision souhaitée.