back-end-study / effective-java

🔥 이펙티브 자바 스터디
42 stars 4 forks source link

[item12] toString을 항상 재정의하라 #18

Closed jun108059 closed 2 years ago

sawooook commented 2 years ago

74P 10번째 줄을 보게 되면

Assertion failure: expected {abc, 123}, but was {abc, 123} 부분이 있는데 해당 부분이 왜 단언실패일까요?! 똑같아 보여서 성공같은데 ...! 이부분 궁금합니다!

jun108059 commented 2 years ago

@sawooook

책에서 설명하는 요약 정보를 담는 경우에 발생할 수 있는 이슈인 것 같습니다.

예를 들면, 아래와 같은 Member 클래스에서 toString을 재정의할 때 요약하다가 id를 제외하였다고 가정하고 Test를 하면 비슷한 상황을 재현할 수 있을 것 같습니다.

public class Member {

    long id;
    String name;
    int age;

    @Override
    public String toString() {
        return name + " " + age;
    }

}

완벽하지는 않지만 재현한 Test 코드입니다.

import static org.junit.jupiter.api.Assertions.*;

class ToStringInfoTest {

    @Test
    void 왜_틀렸다고_할까요() {

        Member infoA = new Member(1L, "영준",  28);
        Member infoB = new Member(2L, "영준",  28);

        assertEquals(infoA, infoB);
    }

}
org.opentest4j.AssertionFailedError: expected: study.yjpark.chapter03.item12.Member@25ce9dc4<영준 28> but was: study.yjpark.chapter03.item12.Member@74ea2410<영준 28>

Assert 구문에 객체를 넘길 때, toString을 호출하기 때문에 동명이인의 영준 28이라는 Member가 다르지만 재정의한 toString 메서드에서 주요 정보를 잘못 선택한 경우를 보여준 경우입니다.