AssertJ 동등성 검사

김민규·2023년 2월 10일
0

java

목록 보기
3/7

jUnit5 기준으로 작성했습니다.

동일성, 동등성 👀

동일성

  • 두 개의 오브젝트가 완전히 같은 동일한(identical) 오브젝트인지 확인
  • 두 개의 오브젝트가 동일하다면 하나의 오브젝트만 존재하는 것이고 두 개의 오브젝트 레퍼런스 변수를 갖고 있을 뿐이다.

동등성

  • 동일한 정보를 담고 있는지 확인(equivalent)
  • 클래스에서 equals()메서드를 따로 구현하지 않았다면, 최상위 클래스인 Object 클래에서 구현되어 있는 equals() 메서드가 사용된다.

🤏 jUnit Assertion

@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()를 재정의해줬다면 결과는 성공이지만 테스트를 위해 재정의하지 않았다.

usingRecursiveComparison

이번에는 동등성 비교를 위한 메서드를 사용하겠다.

@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() 메서드를 이용하면 필드를 재귀적으로 호출하면서 비교하기 때문에 동등성 비교를 할 수 있다.

ignoringFields

@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() 메서드를 활용하면 특정 필드를 무시하고 비교할 수 있다.


출처

profile
Backend Engineer, Vim User

0개의 댓글