쌓고 쌓다
Mockito given willReturn이 동작하지 않을때 본문
Response Body에 값이 담겨 있지 않는 문제가 발생했다.
컨트롤러 코드는 다음과 같았다.
memberService에 addMember를 통해 반환된 MemberResponse를 body 응답으로 보낸다.
테스트 코드에 given을 사용하여 다음과 같이 signUpMember이 들어왔을때 memberResponse를 반환하도록 했다.
/*
SignUpMember signUpMember = new SignUpMember();
signUpMember.setName("새로운닉네임");
signUpMember.setLoginId("새로운아이디");
signUpMember.setLoginPwd("새로운비밀번호");
MemberResponse memberResponse = new MemberResponse();
memberResponse.setMemberId(1L);
memberResponse.setName(signUpMember.getName());
memberResponse.setRole(Role.USER);
*/
given(memberService.addMember(signUpMember)).willReturn(memberResponse);
테스트 코드를 돌려보면 응답으로 201 상태 코드는 반환했지만 body에는 아무것도 들어있지 않는다...
body에 담을 MemberResponse는 memberService.add를 통해 반환되는데 반환되지 않은 것이다.
그래서 verity를 사용하여 실제로 이 함수가 제대로 1회 동작했는지 검증 코드를 넣어봤다.
verify(memberService, times(1)).addMember(signUpMember);
인자로 넘긴 객체가 서로 다른 객체라서 문제가 되고 있다.
실제 컨트롤러에 넘어온 SignUpMember와 서비스 addMember 실행하는 SignUpMember가 달라서 발생하는 문제이다.
컨트롤러로 보낸 JSON을 SignUpMember로 변환하여 컨트롤러단에서 처리하기에
내가 given willReturn시 등록한 객체와 달라 동작하지 않는것이였다.
해결 방법
- 객체 비교의 equals() 메서드 오버라이딩
- SignUpMember 클래스에 @Data 붙이기 (@Data에 @EqualsAndHashCode가 존재하기 때문)
- @EqualsAndHashCode : equals(동등성) 함수와, hashcode(동일성) 함수를 오버라이딩해줌.
'프로그래밍 > spring' 카테고리의 다른 글
LocalDateTime 또는 Enum 타입 jsonPath value 검증 주의사항 (0) | 2024.02.02 |
---|---|
Controller 테스트시 401, 403 에러 발생 (WebMvcTest에 SecurityConfig 설정하는법) (1) | 2024.01.31 |
REST API 페이징 처리 방법! (0) | 2024.01.29 |
Spring Security 404 에러 대신 401 에러 뜰때 (1) | 2024.01.28 |
REST API 테스트 코드 작성하기 with MockMVC (0) | 2024.01.27 |
Comments