Sto lavorando a un progetto in cui le chiamate interne alla classe sono normali, ma i risultati sono molte volte valori semplici. Esempio ( codice non reale ):
public boolean findError(Set<Thing1> set1, Set<Thing2> set2) {
if (!checkFirstCondition(set1, set2)) {
return false;
}
if (!checkSecondCondition(set1, set2)) {
return false;
}
return true;
}
Scrivere test di unità per questo tipo di codice è davvero difficile, in quanto voglio solo testare il sistema di condizioni e non l'implementazione delle condizioni effettive. (Lo faccio in test separati.) In effetti sarebbe meglio se passassi le funzioni che implementano le condizioni e nei test fornisco semplicemente un po 'di finzione. Il problema con questo approccio è la rumorosità: usiamo molto i generici .
Una soluzione di lavoro; tuttavia, è rendere l'oggetto testato spy e prendere in giro le chiamate alle funzioni interne.
systemUnderTest = Mockito.spy(systemUnderTest);
doReturn(true).when(systemUnderTest).checkFirstCondition(....);
La preoccupazione qui è che l'implementazione del SUT è effettivamente cambiata e potrebbe essere problematico mantenere i test in sincronia con l'implementazione. È vero? C'è la migliore pratica per evitare questo caos di chiamate al metodo interno?
Si noti che stiamo parlando di parti di un algoritmo, quindi suddividerlo in più classi potrebbe non essere una decisione desiderata.