해결된 질문
작성
·
96
0
@Test
@DisplayName("싱글톤의 주의할 점")
void statefulServiceSingleton() {
ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
StatefulService statefulService1 = ac.getBean("testConfig", StatefulService.class);
StatefulService statefulService2 = ac.getBean("testConfig", StatefulService.class);
statefulService1.order("userA", 10000);
statefulService2.order("userB", 20000);
assertThat(statefulService2.getPrice()).isSameAs(20000);
}
오류 메시지
java.lang.AssertionError:
Expecting actual:
20000
and:
20000
to refer to the same object
이렇게 테스트 했더니 오류가 뜹니다!ㅠㅠㅠ
Assertions.assertThat().isSameAs()
Assertions.assertThat().isEqualsTo()
두 개의 차이점이 궁금합니다!
답변 1
1
안녕하세요. 권정익님, 공식 서포터즈 y2gcoder입니다.
Assertions.assertThat().isSameAs(): 두 객체 간 참조가 동일한지 검사합니다!
Assertions.assertThat().isEqualTo(): 두 객체 간 값이 동일한지 검사합니다!
검사 대상인 statusfulService2.getPrice()는 int 형이고 기본형이기 때문에 참조가 비슷한지 검사하는 isSameAs()는 적합하지 않습니다. 오토박싱이 일어나 statefulService2.getPrice()가 Integer 객체가 되고, 20000 리터럴이 Integer 타입이 된다고 해도 서로 새로운 객체를 생성한 것이기 때문에 비교가 실패할 수 있습니다.
동등성 비교와 동일성 비교에 대해 검색해보시면 좀 더 많은 인사이트를 얻으실 수 있으실 거라 생각합니다
감사합니다.