테스트 목적으로 만 equals()
및 hashCode()
을 구현하는 것은 코드 냄새입니다. 저는 Hamcrest 라이브러리를 사용하지 않으므로 프로젝트에 성공적으로 사용하는 커스텀 솔루션을 제공 할 것이고 사용법에 관해서는 상당히 만족합니다.
public static <E, A> void assertListEquals(BiConsumer<E, A> asserter, List<E> expected, List<A> actual) throws AssertionError {
assertEquals(
"Lists have different sizes. Expected list: " + expected + ", actual list: " + actual,
expected.size(),
actual.size());
for (int i = 0; i < expected.size(); i++) {
try {
asserter.accept(expected.get(i), actual.get(i));
} catch (AssertionError e) {
throw e;
}
}
}
위에서 볼 수 있듯이 BiConsumer는 두 객체의 동일성을 검사하는 논리를 적용하기 위해 사용됩니다. 따라서이 클래스는 테스트 클래스에서 구현되어야한다. 두 객체를 비교할 때 관심있는 클래스의 필드를 정의 할 수 있다는 이점이 있습니다.
사용법은 다음과 같습니다. 처음에는 사용자 정의 클래스 인 f.e.가 있습니다.: 사람
public class Person {
private String firstName;
private String lastName;
private int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
}
그런 다음 시험 방법 볼 수 있습니다 : 나는 테스트 (및 TDD)의 큰 팬이다 이후로 난 항상 도우미 메서드를 만들 수 있도록 항상 테스트 톤을 쓰기
@Test
public void peopleLiveInTheVillage_findPeople_peopleAreFound() throws Exception {
//Arrange
List<Person> expectedPeople = Arrays.asList(
new Person("Lewis", "Smith", 20),
new Person("Steven", "Richard", 25),
new Person("Richie", "Rich", 30));
//Act
List<Person> actualPeople = sut.findPeople();
//Assert
assertListEquals(
(e, a) -> assertPersonEquals(e, a),
expectedPeople,
actualPeople);
}
private void assertPersonEquals(Person expected, Person actual) {
assertEquals(expected.getFirstName(), actual.getFirstName());
assertEquals(expected.getLastName(), actual.getLastName());
assertEquals(expected.getAge(), actual.getAge());
}
을 어디 BiConsumer 포장 :
private void assertPeopleEqual(List<Person> expectedPeople, List<Person> actualPeople) throws AssertionError {
assertListEquals(
(e, a) -> assertPersonEqual(e, a),
expectedPeople,
actualPeople);
}
나는 이것이 도움이되기를 바랍니다, 건배!
생각 나는 'Matcher'의'matchesSafely' 메소드에서'ReflectionEquals'를 사용할 수 없다는 이유를 추가했습니다. –