jUnit5 기준으로 작성했습니다.
identical
) 오브젝트인지 확인equivalent
)equals()
메서드를 따로 구현하지 않았다면, 최상위 클래스인 Object 클래에서 구현되어 있는 equals()
메서드가 사용된다.@Test
void identical() {
// given
Person brown = Person.builder()
.name("brown")
.height(180)
.age(25)
.build();
Person twinBrown = Person.builder()
.name("brown")
.height(180)
.age(25)
.build();
// then
assertThat(brown).isEqualTo(twinBrown);
}
brown
이 같은 사람인지 비교(동일성)하기 위해 isEqualsTo()
메서드를 사용했다.
결과를 실패가 나온다.
expected: com.example.test$Person@7bd4937b
but was : com.example.test$Person@2c35e847
Expected :com.example.test$Person@7bd4937b
Actual :com.example.test$Person@2c35e847
Person
클래스의equals()
메서드와hashCode()
를 재정의해줬다면 결과는 성공이지만 테스트를 위해 재정의하지 않았다.
이번에는 동등성 비교를 위한 메서드를 사용하겠다.
@Test
void equivalent() {
// given
Person brown = Person.builder()
.name("brown")
.height(180)
.age(25)
.build();
Person twinBrown = Person.builder()
.name("brown")
.height(180)
.age(25)
.build();
// then
assertThat(brown)
.usingRecursiveComparison()
.isEqualTo(twinBrown);
}
usingRecursiveComparison()
메서드를 이용하면 필드를 재귀적으로 호출하면서 비교하기 때문에 동등성 비교를 할 수 있다.
@Test
void equivalent() {
// given
Person brown = Person.builder()
.name("brown")
.height(180)
.age(20)
.build();
Person twinBrown = Person.builder()
.name("brown")
.height(180)
.age(25)
.build();
// then
assertThat(brown)
.usingRecursiveComparison()
.ignoringFields("age")
.isEqualTo(twinBrown);
}
ignoringFields()
메서드를 활용하면 특정 필드를 무시하고 비교할 수 있다.