-
Controller 단위테스트 하기프로젝트/WebRTC 화상통화 프로젝트 2022. 7. 26. 16:36
개요
- MemberController를 단위 테스트하려고 합니다.
- MemberController는 MemberService를 의존하고 있습니다.
- @WebMvcTest를 사용하여 테스트합니다.
GET +QueryParam 조회
컨트롤러 메서드
@GetMapping("/info/{nickname}") public ResponseEntity<BasicResponse<MemberResponse>> memberInfo(@PathVariable(value = "nickname") String nickname) { Member member = memberService.getUserInfo(nickname); return new ResponseEntity<>(makeBasicResponse(SUCCESS, member.toMemberResponse()), HttpStatus.OK); }
테스트 코드
@WebMvcTest(MemberController.class) class MemberControllerTest{ @Autowired MockMvc mockmvc; @MockBean private MemberService memberService; @Test @DisplayName("닉네임으로 회원 정보 조회 성공") void getMemberInfoByNicknameSuccess() throws Exception { //given String nickname = "nickname"; Member member = makeMember(nickname); given(memberService.getUserInfo(any(String.class))).willReturn(member); //when RequestBuilder requestBuilder = RestDocumentationRequestBuilders.get("/member/info/{nickname}", nickname); ResultActions resultActions = mockMvc.perform(requestBuilder); resultActions.andExpect(status().isOk()) .andExpect(jsonPath("$.data.nickname").value("nickname")); } }
MemberService는 @MockBean을 통해 가짜 객체를 주입합니다.
이제 가짜 객체가 어떻게 동작하는지 정의해야 합니다.
memberService의 getUserInfo 메서드가 member를 반환할 것이라는 행위를 줍니다.
이후 get /member/info/{nickname} 에 nickname을 인자로 담아서 보내고 수행합니다.
결과로는 200 OK, 그리고 반환값으로 data : {nickname : nickname}이 나올 것으로 검증을 수행합니다.
POST + RequestBody 등록
컨트롤러 메서드
@PostMapping("/nickname") public ResponseEntity<BasicResponse<MemberResponse>> setNickname(@RequestBody NicknameSetResponse nicknameSetResponse) { Member member = memberService.setNickName(nicknameSetResponse); return new ResponseEntity<>(makeBasicResponse(SUCCESS, member.toMemberResponse()), HttpStatus.CREATED); }
테스트 코드
@Test @DisplayName("사용자 닉네임 설정 성공") void setNickname() throws Exception { //given Long memberId = 1L; String nickname = "JunWoo"; given(memberService.setNickName(any(NicknameSetResponse.class))).willReturn(makeMember(nickname)); //when RequestBuilder requestBuilder = RestDocumentationRequestBuilders.post("/member/nickname") .content("{\"memberId\" : \"1\", \"nickname\" : \"JunWoo\"}") .contentType(MediaType.APPLICATION_JSON); ResultActions resultActions = mockMvc.perform(requestBuilder); resultActions.andExpect(status().isCreated()) .andExpect(jsonPath("$.data.nickname").value("JunWoo")) }
이제 가짜 객체가 어떻게 동작하는지 정의해야 합니다.
memberService의 setNickName 메서드가 member를 반환할 것이라는 행위를 줍니다.
content에 JSON 형식으로 http body 메시지를 넣어줍니다.
결과로는 201 CREATED, 그리고 반환값으로 data : {nickname : JunWoo}이 나올 것으로 검증을 수행합니다.
POST + RequestBody + ObjectMapper 등록
컨트롤러 메서드
@PutMapping("/rep-icon") public ResponseEntity<BasicResponse<String>> changeRepIcon(@RequestBody IconResponse repIconResponse) { String repIcon = memberService.setRepIcon(repIconResponse.getNickname(), repIconResponse.getIcon()); return new ResponseEntity<>(makeBasicResponse(SUCCESS, repIcon), HttpStatus.CREATED); }
테스트 코드
@Test @DisplayName("대표 아이콘 설정 성공") void changeRepIconSuccess() throws Exception { //given String repIcon = "repIcon"; IconResponse iconResponse = makeIconResponse(); String body = (new ObjectMapper()).writeValueAsString(iconResponse); given(memberService.setRepIcon(any(), any())).willReturn(repIcon); //when RequestBuilder requestBuilder = RestDocumentationRequestBuilders.put("/member/rep-icon") .content(body) .contentType(MediaType.APPLICATION_JSON); ResultActions resultActions = mockMvc.perform(requestBuilder); //then resultActions.andExpect(status().isCreated()) .andExpect(jsonPath("$.data").value(repIcon)); }
objectMapper를 통하여 iconResponse를 Json으로 파싱하는 방법입니다.
PUT + RequestBody 수정
컨트롤러 메서드
@PutMapping("/nickname") public ResponseEntity<BasicResponse<String>> changeNickname(@RequestBody NicknameChangeResponse nicknameChangeResponse) { memberService.updateNickName(nicknameChangeResponse.getOrigin(), nicknameChangeResponse.getNickname()); return new ResponseEntity<>(makeBasicResponse(SUCCESS, nicknameChangeResponse.getNickname()), HttpStatus.CREATED); }
테스트 코드
@Test @DisplayName("닉네임 변경 성공") void changeNicknameSuccess() throws Exception{ //given String nickname = "JunWoo"; String body = "{\"origin\" : \"origin\", \"nickname\" : \"JunWoo\"}"; //when RequestBuilder requestBuilder = RestDocumentationRequestBuilders.put("/member/nickname") .content(body) .contentType(MediaType.APPLICATION_JSON); ResultActions resultActions = mockMvc.perform(requestBuilder); resultActions.andExpect(status().isCreated()) .andExpect(jsonPath("$.data").value(nickname)); }
'프로젝트 > WebRTC 화상통화 프로젝트' 카테고리의 다른 글
Base62 인코딩을 활용해 초대링크 만들기 (0) 2022.07.31 JPA Entity 연관관계 구현하기(양방향 연관관계 List Empty 문제 해결) (0) 2022.07.29 스프링 부트 + Mysql 도커로 띄우기 (0) 2022.07.21 Spring Rest Docs 적용하기 (0) 2022.07.21 Spring Security Oauth2.0 로그인 단위테스트 (0) 2022.07.20