Ho un'origine dati da cui posso richiedere un elenco di persone che vivono in un paese (qualsiasi) e un metodo che recupera le persone da tale origine dati e le ordina in base al loro nome in ordine alfabetico. Come dovrei scrivere il mio test unitario per assicurarmi che la parte di ordinamento del mio metodo funzioni correttamente?Come si scrive un test unitario per verificare che una funzione elabori il suo risultato?
Questo è ciò che il mio SUT assomiglia:
class PeopleStuff {
public IData data;
public List<Person> getSortedPeopleForCountry(String countryName) {
List<Person> people = data.getPeopleForCountry(countryName);
Comparator nameComparator = new PersonNameComparator();
Collections.sort(people, nameComparator);
return people;
}
}
E questo è ciò che il mio test di unità si presenta come:
@Test public void testGetPeopleSortsByPeopleName() {
String COUNTRY = "Whatistan";
// set up test (the 3 lines below are actually in a @Before setup method)
PeopleStuff peopleStuff = new PeopleStuff();
IData mockData = createNiceMock(IData.class);
peopleStuff.data = mockData;
// set up data
List<PersonName> mockPeopleList = new ArrayList<PersonName>();
mockPeopleList.add(new Person(COUNTRY, "A"));
mockPeopleList.add(new Person(COUNTRY, "D"));
mockPeopleList.add(new Person(COUNTRY, "B"));
mockPeopleList.add(new Person(COUNTRY, "C"));
when(mockData.getPeopleForCountry(COUNTRY)).thenReturn(mockPeopleList);
// exercise
List<String> result = peopleStuff.getSortedPeopleForCountry(COUNTRY);
// assert
assertEquals("A", result.get(0).name);
assertEquals("B", result.get(1).name);
assertEquals("C", result.get(2).name);
assertEquals("D", result.get(3).name);
}
Che cosa ho bisogno di sapere è se il modo in cui mi sto spegnendo i dati , eseguendo il test e rendendo le asserzioni corrette, o se ci sono modi migliori per farlo.
La mia applicazione ha molti metodi per testare e molti algoritmi di ordinamento personalizzati; Ho implementato tutti i test per utilizzare 4 valori che ho mozzato così, in a "random" order che scelgo quando scrivo il test.
Devo testare solo se vengono chiamati i comparatori? Non mi sembra giusto, perché non so se vengono chiamati i dati giusti o al momento giusto nell'algoritmo che si trova all'interno di getSortedPeopleForCountry()
. Voglio rilevare situazioni come questa:
public List<Person> getSortedPeopleForCountry(String countryName) {
List<Person> people = data.getPeopleForCountry(countryName);
Comparator nameComparator = new PersonNameComparator();
List<Person> sortedPeople = new ArrayList<Person>(people)
Collections.sort(sortedPeople, nameComparator);
return people; // oops!
}
Devo lasciare in questo modo e aggiungere comparatori finte che utilizzano i veri comparatori ma anche verificano che stanno chiamati?
Sto facendo bene?
Vorrei ordinare l'elenco e quindi iniziare a confrontare i suoi elementi in coppie per assicurarmi che l'elemento * current * abbia lo stesso o un * più grande * paese del precedente. –
@LuiggiMendoza L'ho già fatto, ma ho cambiato idea. Ciò ha aggiunto una dipendenza a 'PersonNameComparator' all'interno del test. E ci sono voluti un ciclo 'for' di 3 linee, il che significa un algoritmo in più nel test che un lettore dovrebbe capire per capire il test. –
Fai sembrare che 3 linee di codice siano piuttosto difficili da capire ... Infatti, dato che non lavoro con easymock, tutto il codice di cui sopra è molto più difficile da capire di un semplice ciclo 'for' con un 'if'. –