반응형

컨트롤러에서 단위테스트를 작성하던 중, 메소드가 호출되었는지 verify()를 사용하는데 다음과 같은 메세지가 나왔습니다.

Argument(s) are different! Wanted:
...
-> ...
Actual invocations have different arguments:
...
-> ...

arguments가 다르다고 합니다.

값을 찍어보니 컨트롤러에서 출력되는 값과 테스트 코드에서 출력되는 값은 일치하는데, 객체의 실제 멤버변수 값을 비교하는게 아니라 참조 값을 비교해서 그런거였습니다.

 

테스트 코드에서 문제가 된 코드는 다음과 같습니다.

verify(signService).register(info); // 문제가 된 코드

signService.register()가 제대로 호출되는지 보려고 했는데, info값이 다르다는 것입니다.

이런 경우 ArgumentMatchers.refEq()로 해당 객체를 감싸주면 됩니다.

https://javadoc.io/doc/org.mockito/mockito-core/2.8.47/org/mockito/ArgumentMatchers.html

이에 대한 내용은 여기에서 찾아볼 수 있습니다.

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.

라고 나와있습니다. equals()가 구현되지 않았을 때, 원하는 객체와 실제 객체를 비교한다고 합니다.

equals로 비교하나봅니다. 그냥 refEq()를 호출하지않고, 클래스에 equals와 hashcode를 재정의해주면 됩니다.

반응형

+ Recent posts