Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Assertions 의 isEqualTo 와 isSameAs 차이점 분석


assertjAssertions 클래스를 테스트 코드를 작성하면서 많이 사용한다.

특히 isEqualToisSameAs를 사용해서 테스트를 많이 진행한다.

언뜻 보면, 의미상 같은 동작을 하는 메서드 같지만 다르다.

나도 어떤 점이 다른지, 여러 테스트를 해봤고 덕분에 확실히 알게 되었다.

간단하게 말하면

isEqualTo 는 해당 값이 같은지를 확인하고, 객체가 비교 대상이 된다면 Java 문법의 equals() 메서드와 같은 기능을 한다.

isSameAs 는 참조 값이 같은지 확인한다.

Member member1 = new Member(1L, "memberA", Grade.VIP);
Member member2 = new Member(1L, "memberA", Grade.VIP);
//↑ member 1 과 member 2 는 같은 속성의 값을 갖지만, 다른 참조값을 갖고 있는 서로 다른 객체이다.
        
String a = "HI";
String b = new String("HI");
        
//Case 1
assertThat(member1).isSameAs(member2);
        
//Case 2
assertThat(member1).isEqualTo(member2);
        
//Case 3
assertThat(member1.getName()).isEqualTo(member2.getName());
        
//Case 4
asserThat(a).isEqualTo(b);

위와 같은 상황이 있다고 할때,

Case 1Case 2에서 에러가 발생할 것이고

Case 3 의 경우는, 각 객체에서 memberA 라는 이름을 가져온 뒤, 비교를 하므로 통과될 것이다.

Case 4 의 경우 역시, Java의 equals() 메서드의 기능처럼, 같은 문자열을 갖고 있으므로 주소값은 다르지만, 통과할 것이다.


Member member1 = new Member(1L, "memberA", Grade.VIP);
memberService.join(member1);
        
Member member2 = memberService.findMember(1L);
//↑ member 1을 입력하고, member 1 이 가진 id(key) 1L을 통해서 초기화한 member2는 같은 객체이다.
        
assertThat(member1).isSameAs(member2);
assertThat(member1).isEqualTo(member2);
assertThat(member1.getName()).isEqualTo(member2.getName());

위와 같은 상황에서는 사실상 member1member2 가 같은 객체이므로

모든 상황에서 에러가 발생하지 않을 것이다.


정리

즉, 특정 값을 비교하거나 String 값 비교에는 isEqualTo 를 사용하고, 객체의 참조 값(주소)를 비교할 때에는 isSameAs 를 사용한다!