[TDD]JUnit 'assertEquals()' 비교 및 검증 메서드에서 참조 타입, 원시 타입비교하기

박두팔이·2024년 1월 21일
0

Unit 'assertEquals()' 비교 및 검증 메서드에서 참조 타입, 원시 타입비교

1. 궁금한 내용❓

JUnit5로 테스트코드를 작성할 때, 비교 및 검증로직에서 어떤것은 객체로 비교하고 어떤것은 toString()을 사용하여 비교를 한다. 무슨차이가 있을까?

아래는 그 예시 코드이다.

// 참조타입으로 비교한 코드
@Test
    void show_실패_존재하지_않는_id_입력() {
        Long id = -1L;
        // 1. 예상데이터
        Article expected = null;

        // 2. 실제데이터
        Article article = articleService.show(id);

        // 3. 비교 및 검사
        assertEquals(expected,article); // ✅ 객체로 비교
    }
  • 여기서는 expected와 article 객체를 직접 비교하고 있다. 두 객체가 동등한지 여부를 assertEquals를 통해 확인한다.
  • 객체의 주소값을 비교하게 되어, null과 Article객체의 여부를 확인할 수 있다.
// toString()메서드를 사용하여 문자열로 변환한 값으로 비교
@Test
    void create_성공_title_content만_있는_dto_입력() {
        // 1. 예상데이터
        String title = "라라라라";
        String content = "4444";
        ArticleForm dto = new ArticleForm(null,title, content);
        Article expected = new Article(4L, title, content);

        // 2. 실제 데이터
        Article article = articleService.create(dto);

        // 3. 비교 및 검증
        assertEquals(expected.toString(),article.toString());

    } // ✅ toString()으로 비교 
  • 여기서는 expected와 article 객체를 각각 문자열로 변환한 뒤, 그 문자열을 비교하고있다.
  • toString()메서드는 객체를 문자열로 변환하는 메서드이다. 일반적으로 이 메서드는 객체의 내용을 반환하기 때문에 expected객체와 article객체의 내용을 비교하는 것이다.

2. 궁금증 해결 💡

첫번째 메서드는 단순히 null의 여부만 확인하면 되었기 때문에 객체의 주솟값을 비교하면 되지만, 두번째 메서드는 객체의 값을 비교하기 때문에 toString()이 필요하다.

  • 자바의 객체(인스턴스)는 힙메모리에 생성이 되는데, article이라는 변수에는 힙메모리 주소가 저장된다.
  • 그런데 expected는 new를 통해서 새로운 인스턴스를 생성했고, article은 db에서 조회해온 인스턴스이기 때문에 둘의 주소값은 다를 수 밖에 없다.
  • 그래서 메모리 주소만을 비교했을 때 테스트가 실패한다.
  • 따라서, toString()을 사용해서 값을 비교하는 방법을 사용해야한다.
  • 그러나, 일반적으로는 toString을 사용하기 보다는 필드 하나하나를 getter를 통해 가져와 assertEquals로 비교한다.

일단, toString()가 반환하는 값에 대해 무지했던 문제인것같다.
그리고 JUnit에서 제공하는 assertEquals()메서드가 여러타입을 각각 비교할 수 있다는 것도 새롭게 알게되었다.

개괄적으로 java+springBoot를 이해하기 위해 스터디에 들었는데, 기초부터 하고있어서 그런지 도움이 많이 되고있다 😄

profile
기억을 위한 기록 :>

0개의 댓글