我有一个数据源,我可以从中请求一个居住在任何国家的人的列表,以及一种从该数据源中检索人并按字母顺序排列他们的方法。我应该如何编写单元测试以确保我的方法的排序部分正常工作?如何编写单元测试来验证函数对结果进行排序?
这是我的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'。 –