Tôi có một nguồn dữ liệu mà từ đó tôi có thể yêu cầu một danh sách những người sống ở một quốc gia (bất kỳ) và phương thức truy xuất những người từ nguồn dữ liệu đó và sắp xếp chúng theo tên của họ theo thứ tự bảng chữ cái. Làm thế nào tôi nên viết bài kiểm tra đơn vị của mình để đảm bảo rằng phần sắp xếp của phương pháp của tôi hoạt động chính xác?Làm cách nào để viết một bài kiểm tra đơn vị để xác minh rằng một hàm sắp xếp kết quả của nó?
Đây là những gì SUT của tôi trông giống như:
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;
}
}
Và đây là những gì thử nghiệm đơn vị của tôi trông giống như:
@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);
}
Những gì tôi cần biết là nếu cách này tôi đang stubbing dữ liệu , chạy thử nghiệm và đưa ra các xác nhận là chính xác hoặc nếu có cách tốt hơn để thực hiện việc này.
Ứng dụng của tôi có nhiều phương pháp để kiểm tra và rất nhiều thuật toán sắp xếp tùy chỉnh; Tôi đã thực hiện tất cả các bài kiểm tra để sử dụng một số 4 giá trị mà tôi đã khai như thế, in a "random" order mà tôi chọn khi tôi viết bài kiểm tra.
Tôi có nên kiểm tra các bộ so sánh được gọi không? Điều đó dường như không đúng với tôi, bởi vì tôi không biết liệu họ có được gọi đúng dữ liệu hay đúng thời điểm trong thuật toán bên trong getSortedPeopleForCountry()
hay không. Tôi muốn phát hiện những tình huống như thế này:
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!
}
Tôi có nên để nó như này và thêm bộ so sánh mô hình mà sử dụng bộ so sánh thật nhưng cũng xác nhận rằng họ đang được gọi là?
Tôi có làm đúng không?
Tôi sẽ sắp xếp danh sách và sau đó bắt đầu so sánh các phần tử theo cặp để đảm bảo phần tử * current * có cùng hoặc một quốc gia * lớn hơn * so với trước đó. –
@LuiggiMendoza Tôi đã làm điều đó, nhưng tôi đã đổi ý. Điều đó đã thêm một sự phụ thuộc vào 'PersonNameComparator' bên trong bài kiểm tra. Và nó lấy một vòng lặp 'for' của 3 dòng, có nghĩa là một thuật toán bổ sung trong bài kiểm tra mà người đọc sẽ phải hiểu để hiểu bài kiểm tra. –
Bạn làm cho nó trông giống như 3 dòng mã là khá khó hiểu ... Trong thực tế, vì tôi không làm việc với easymock, tất cả các mã trên cho tôi là cách khó hiểu hơn một vòng lặp 'for' đơn giản với một 'if'. –