Sto lavorando a un progetto in cui le chiamate interne di classe sono usuali ma i risultati sono molte volte valori semplici. Esempio ( non codice 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 unit test per questo tipo di codice è davvero difficile in quanto voglio solo testare il sistema di condizioni e non l'implementazione delle condizioni reali. (Lo faccio in test separati.) In effetti sarebbe meglio se passassi funzioni che implementano le condizioni e nei test fornisco semplicemente un po 'di derisione. Il problema con questo approccio è la rumorosità: usiamo molto i generici .
Una soluzione funzionante; tuttavia, è rendere l'oggetto testato una spia e deridere le chiamate alle funzioni interne.
systemUnderTest = Mockito.spy(systemUnderTest);
doReturn(true).when(systemUnderTest).checkFirstCondition(....);
La preoccupazione qui è che l'implementazione del SUT sia effettivamente cambiata e potrebbe essere problematico mantenere i test sincronizzati con l'implementazione. È vero? Esistono buone pratiche per evitare questo caos delle chiamate interne al metodo?
Si noti che stiamo parlando di parti di un algoritmo, quindi suddividerlo in più classi potrebbe non essere una decisione desiderata.