java junit, 필드 값으로 객체 비교하기 (assertJ, 동등성 비교)

junit assertJ를 활용한 동등성 비교

  • 동등성 비교를 할 때, 우리는 두 가지 상황을 상상할 수 있다.
    • 주소만 다르고 값은 완전 일치
    • 필드 일부분(수정일 등)만 차리를 가지며 나머지는 동일
  • 이러한 상황에서 사용하는 junit 메서드가 usingRecursiveComparison() 이다.
import lombok.RequiredArgsConstructor;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class RecursiveTest {

    @Test
    void test1(){
        final Tester kim1 = new Tester("kim", 10);
        final Tester kim2 = new Tester("kim", 10);

        assertThat(kim1).isNotEqualTo(kim2); // 필드의 값이 같더라도 isEquals()에 대하여 false 를 반환한다.
        assertThat(kim1).usingRecursiveComparison().isEqualTo(kim2);
    }

    @Test
    void test2() {
        final Tester kim1 = new Tester("kim", 10);
        final Tester kim2 = new Tester("kim", 11);

        assertThat(kim1).isNotEqualTo(kim2);
        assertThat(kim1).usingRecursiveComparison().isNotEqualTo(kim2);
        assertThat(kim1).usingRecursiveComparison().ignoringFields("name").isNotEqualTo(kim2);
        assertThat(kim1).usingRecursiveComparison().ignoringFields("age").isEqualTo(kim2);
    }

    @RequiredArgsConstructor
    static class Tester{
        private final String name;
        private final int age;
    }
}

참고

  • junit의 경우 메서드 명에서 어떤 기능일지 상상할 수 있도록 잘 만들어졌다. 나도 메서드명을 이렇게 멋지게 만들고 싶다. 아래의 메뉴얼을 훑어 보다가 해당 기능을 찾을 수 있었다. 참고 바란다.

https://javadoc.io/doc/org.assertj/assertj-core/latest/org/assertj/core/api/AbstractObjectAssert.html#usingComparatorForFields(java.util.Comparator,java.lang.String…)