😱 에러
Board를 조회,추가,삭제,수정하는 BoardController Test코드를 작성하는 도중, Argument(s) are different! Wanted: 라는 에러가 발생했다 🥺 에러를 해결하고 왜 이러한 에러가 발생했는지 알아보자
📌 Error 해석
✏️ Argument(s) are different! Wanted
: 우선 에러를 파악해보자
코드를 다 읽을 필요없이 중요한 코드만 해석해보자
Argument(s) are different!
Actual invocations have different arguments:
arguments값이 다르다고 한다. 값을 찍어보니 컨트롤러에서 출력되는 값과 테스트 코드에서 출력되는 값은 분명 일치하는데, 객체의 실제 멤버변수 값을 비교하는게 아니라 "참조 값을 비교" 해서 생긴 에러같았다.
💡참조 값을 비교한다라는 것은?
: 두 개의 객체가 메모리에서 동일한 "위치"에 있는지 비교한다는 것이다.(자바의 "=="연산자는 참조 값을 비교하기때문에 동일한 값이 있는지 확인하고 싶을 때는 "equals()"를 사용하도록 하자.)
📌 첫 번째 시도
✏️ ArgumentMatchers.refEq()를 사용해보자!
: ArgumentMatchers.refEq()란?
refEq()메소드는 Mockito 라이브러리에서 제공하는 메소드로, 객체의 동등성을 비교할 때 사용된다.
기본적으로 객체의 필드 값을 비교하며 동등성을 판단하며, 이 때 객체 내부의 필드들도 재귀적으로 동등성을 확인한다.
위처럼 test_requestBoard 객체를 refEq() 메서드로 감싸주었다.
⭐️ 결과는 !!!!!!!!!!!!!
"실패"였다..🥹
📌 두 번째 시도
✏️ equals()와 HashCode()를 재정의 해보자!
:equals()와 HashCode()란?
- equals() 메서드:
- 두 객체가 논리적으로 동등한지 비교한다.
- 객체의 필드 값을 기준으로 비교하며, 두 객체의 필드 값이 모두 같으면 true를 반환한다.
- hashCode() 메서드:
- 객체의 해시 코드를 반환한다.
- 해시 코드는 객체를 해시 기반의 컬렉션(예: HashMap, HashSet)에 저장하거나 조회할 때 사용된다.
- equals() 메서드를 오버라이드할 때는 hashCode() 메서드도 일관성 있게 오버라이드해야 한다.
에러를 조금 더 자세하게 파악하기 위해서 위에 똑같은 User를 대입한 test_board와 test_requestBoard의 User 참조값을 확인하고,
에러 내용을 다시 확인했다. test_board, test_requestBoard의 User객체의 참조값은 User@69ce14e6
에러 내용을 보면 User@69ce14e6라는 값을 원했지만 User@717a8a76라는 값이 들어가있다는 것을 확인할 수 있었다.
Object argument that is reflection-equal to the given value with support for excluding selected fields from a class. This matcher can be used when equals() is not implemented on compared objects. Matcher uses java reflection API to compare fields of wanted and actual object.
출처: https://javadoc.io/doc/org.mockito/mockito-core/2.8.47/org/mockito/ArgumentMatchers.html
위의 글에 들어가서 읽어보면 equals()가 구현되지 않았을 때, 원하는 객체와 실제 객체를 비교한다고 한다.
클래스에 equals와 hashcode를 재정의를 해주자.
⭐️ 결과는 !!!!!!!!!!!!!
"테스트 성공"😆