Spring/Error

[JUit] Argument(s) are different! Wanted: 에러

haenni 2024. 7. 3. 10:30

😱 에러

Board를 조회,추가,삭제,수정하는 BoardController Test코드를 작성하는 도중, Argument(s) are different! Wanted: 라는 에러가 발생했다 🥺 에러를 해결하고 왜 이러한 에러가 발생했는지 알아보자

BoardController.java
BoardControllerTest.java
error


 

 

 

📌 Error 해석

✏️ Argument(s) are different! Wanted

: 우선 에러를 파악해보자

error

코드를 다 읽을 필요없이 중요한 코드만 해석해보자
Argument(s) are different!
Actual invocations have different arguments:

arguments값이 다르다고 한다. 값을 찍어보니 컨트롤러에서 출력되는 값과 테스트 코드에서 출력되는 값은 분명 일치하는데, 객체의 실제 멤버변수 값을 비교하는게 아니라 "참조 값을 비교" 해서 생긴 에러같았다.

💡참조 값을 비교한다라는 것은?
: 두 개의 객체가 메모리에서 동일한 "위치"에 있는지 비교한다는 것이다.(자바의 "=="연산자는 참조 값을 비교하기때문에 동일한 값이 있는지 확인하고 싶을 때는 "equals()"를 사용하도록 하자.)

 

 

 

 

 

📌 첫 번째 시도

✏️ ArgumentMatchers.refEq()를 사용해보자!

: ArgumentMatchers.refEq()란?

 

refEq()메소드는 Mockito 라이브러리에서 제공하는 메소드로, 객체의 동등성을 비교할 때 사용된다.
기본적으로 객체의 필드 값을 비교하며 동등성을 판단하며, 이 때 객체 내부의 필드들도 재귀적으로 동등성을 확인한다.

 

위처럼 test_requestBoard 객체를 refEq() 메서드로 감싸주었다.

 

 

⭐️ 결과는 !!!!!!!!!!!!!

"실패"였다..🥹 

 

 

 

📌 두 번째 시도

✏️ equals()와 HashCode()를 재정의 해보자!

:equals()와 HashCode()란?

 

  1. equals() 메서드:
    • 두 객체가 논리적으로 동등한지 비교한다.
    • 객체의 필드 값을 기준으로 비교하며, 두 객체의 필드 값이 모두 같으면 true를 반환한다.
  2. 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를 재정의를 해주자.

 

User.java

 

⭐️ 결과는 !!!!!!!!!!!!!

"테스트 성공"😆