ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Controller 단위테스트 하기
    프로젝트/WebRTC 화상통화 프로젝트 2022. 7. 26. 16:36
    728x90

    개요

    - 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));
        }

     

    댓글

Designed by Tistory.