我有一个数据源,我可以从中请求一个居住在(任何)国家的人的列表,以及一个从该数据源检索人员并按姓名字母顺序对他们进行排序的方法。我应该如何编写单元测试以确保我的方法的排序部分正常工作?
这就是我的 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 个值,按照我在编写测试时选择的“随机”顺序。
我应该只测试是否调用了比较器吗?这对我来说似乎不对,因为我不知道他们是否被要求提供正确的数据或在内部算法中的正确时间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!
}
我应该这样保留它并添加使用真实比较器但还要验证它们被调用的模拟比较器吗?
我做对了吗?