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

 

[JUnit] Argument(s) are different! Wanted: 에러 해결

temp2 [JUnit] Argument(s) are different! Wanted: JUnit Controller 테스트에서 validation 중에 발생한 에러!! 에러가 설명하듯이 인자가 다르단다. 어? 근데 콘솔 찍히는거보면 똑같은데 왜 다르다고 뜨지?라는 의

zorba91.tistory.com