Java/Spring with Error
[해결 방법] Argument(s) are different!
HJ0216
2024. 9. 15. 00:14
Argument(s) are different!
Actual invocations have different arguments:
Environment
Language: Java 17
Framework: SpringBoot 3.1.0
DB: MySQL, Redis
오류
Argument(s) are different! Wanted:
userService bean.create(
com.msgs.domain.user.dto.SignUpRequestDTO@4dbf902
);
-> at com.msgs.domain.user.service.UserService.create(UserService.java:47)
Actual invocations have different arguments:
userService bean.create(
com.msgs.domain.user.dto.SignUpRequestDTO@7739bcca
);
-> at com.msgs.domain.user.controller.UserController.create(UserController.java:31)
userService.create()에 인자로 전달한 SignUpRequestDTO의 주소값이 상이
원인
@Test
@DisplayName("Controller: 회원 가입")
void create() throws Exception {
// given
SignUpRequestDTO signUpDto = SignUpRequestDTO.builder()
.status("M")
.email("Tcontroller@email.com")
.phone("01023698741")
.nickname("Tname")
.password("test123!")
.confirmPassword("test123!")
.build();
// when // then
mockMvc.perform(post("/api/v2/users/new")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(signUpDto)))
.andExpect(status().isOk()); // 응답이 200 OK 인지 확인
// 회원 생성 메소드가 호출되었는지 확인
verify(userService).create(signUpDto);
}
⭐ verify(userService).create(signUpDto)는 기본적으로 두 객체의 메모리 주소가 다르면 동일하지 않다고 판단
MockMvc를 통해 요청이 직렬화(SignUpRequestDTO → JSON, body안에 데이터를 넣음)와 역직렬화(JSON → SignUpRequest, body안의 데이터를 DTO 타입으로 변경) 과정을 거치면서 새로운 SignUpRequestDTO 객체가 생성되었고, 그로 인해 객체가 동일하지 않다고 판단
해결
@Test
@DisplayName("Controller: 회원 가입")
void create() throws Exception {
// given
SignUpRequestDTO signUpDto = SignUpRequestDTO.builder()
.status("M")
.email("Tcontroller@email.com")
.phone("01023698741")
.nickname("Tname")
.password("test123!")
.confirmPassword("test123!")
.build();
// when // then
mockMvc.perform(post("/api/v2/users/new")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(signUpDto)))
.andExpect(status().isOk()); // 응답이 200 OK 인지 확인
// 회원 생성 메소드가 호출되었는지 확인
verify(userService).create(refEq(signUpDto));
}
⭐ refEq() 사용
필드의 값을 비교하여 두 객체가 동일한지 확인
📑
참고 자료
https://zorba91.tistory.com/235