【发布时间】:2013-07-15 06:31:28
【问题描述】:
我有一个数据源,我可以从该数据源请求居住在(任何)国家/地区的人员列表,以及从该数据源检索人员并按姓名字母顺序对他们进行排序的方法。我应该如何编写单元测试以确保我的方法的排序部分正常工作?
这就是我的 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,所以上面所有的代码对我来说都比一个更难理解带有
if的简单for循环。 -
@LuiggiMendoza:然后证明
@Test方法作为问题的答案。 -
参考this Q/A
标签: java unit-testing junit easymock