我有一個數據源,我可以從中請求一個居住在任何國家的人的列表,以及一種從該數據源中檢索人並按字母順序排列他們的方法。我應該如何編寫單元測試以確保我的方法的排序部分正常工作?如何編寫單元測試來驗證函數對結果進行排序?
這是我的SUT的樣子:
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;
}
}
這是我的單元測試是什麼樣子:
@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);
}
我需要知道的是,如果這樣我磕碰數據,運行測試並做出斷言是正確的,或者是否有更好的方法來做到這一點。
我的應用程序有很多方法來測試和很多自定義排序算法;我實施了所有測試,以使用4個我喜歡的測試值,in a "random" order,這是我在編寫測試時選擇的值。
我應該只測試比較器是否被調用?這對我來說並不合適,因爲我不知道他們是否需要正確的數據或在getSortedPeopleForCountry()
內部的算法中正確的時間。我想檢測這樣的情況:
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!
}
我應該把它像這樣和增加其使用真正的比較也證實他們被稱爲模擬比較器?
我在做對吧?
我會對列表進行排序,然後開始比較其中的元素,以確保* current *元素與前一個元素具有相同或更大的*國家。 –
@LuiggiMendoza我已經做到了,但我改變了主意。這在測試中添加了對'PersonNameComparator'的依賴。它採用了3行的「for」循環,這意味着測試中的額外算法,閱讀者必須理解這些算法才能理解測試。 –
你讓它看起來像3行代碼很難理解......實際上,因爲我不使用easymock,所以上面的代碼對於我來說比使用簡單的for循環更難以理解。 'if'。 –