[TIL] Today I Lerned - 230117

2023. 1. 17. 22:30기록/TIL

[TIL] Today I Lerned - 230117

 

2330117 기록

 

learned

 

  • 단위 테스트로는 리펙토링 /  통합테스트로는 각 기능이 잘 돌아가는지 확인 가능
    • 단위 테스트의 경우 repository 저장 부분 같은 기능의 동작 여부를 파악하기가 힘듦
    • 다만 해당 코드의 과정에서 어떤 부분이 필요 유무를 따지면서 리펙토링 과정에 사용할 수 있음
    • 통합 테스트의 경우 환경 설정의 범위에서 최소한으로 하더라도 한 번씩 어떤 과정을 통해 코드가 진행되는지 살펴보는 게 좋음
      • @Transactional의 기능이 확실하게 돌아가는지 파악 가능
    • 최소한이더라도 통합테스트를 한번씩 해보자
      • 조회 기능은 다른 기능의 테스트를 위해 엮여있는 기능
  • controller test 작성을 하면서 배운 것들
    • mock.perform 
      • 요청을 수행하고 예상되는 반환값과 예상값을 연결할 수 있는 메서드들을 수행
      • 해당 perform 안에는 우리가 컨트롤러를 작성할 때 사용했던 HTTP 메서드, URI를 입력하여 어디에서 요청이 들어왔는지를 지정할 수 있다.
    • contentType
      • 해당 요청에 타입이 어떤 타입인지 지정할 수가 있는 부분
      • MediaType이라고 하며 현재 사용하는 Json부터 image, xml, text 등의 다양한 타입들이 존재한다.
    • content
      • 어떤 값이 해당 요청으로 들어왔는지 확인
      • postman 등으로 json타입으로 들어오는 값은 spring 내부에서 objectMapper를 통해 직렬화되어서 들어오는데 해당 test 단계에서는 해당 과정이 따로 존재하지 않으므로 objectmapper를 따로 선언해서 해당 과정을 처리해야 한다.
      • objectMapper.writeValueAsBytes() 메서드를 사용하면 우리가 입력한 값을 java의 byte 배열로 직렬화를 한다
    • andExpect
      • 해당 요청으로 예상되는 값을 넣어주는 부분, 즉 응답에 관한 부분이다.
      • 해당 부분부터 나오는 값들을 통해 우리가 요청한 메서드에서 어떤 값을 출력하는지 알 수 있음

andExpect()의 예시

 


금일 작성했던 Controller Test code 중 일부분

 

 @Test
    @DisplayName("상품 가격 수정 컨트롤러 메서드")
    void updateProduct() throws Exception {
        Long productId = 1L;
        ProductUpdateRequestDto requestDto = new ProductUpdateRequestDto(20000);
//        String content = new ObjectMapper()
//                .registerModule(new JavaTimeModule())
//                .writeValueAsString(requestDto);
//        given(productService.updateProduct(productId, requestDto)).willReturn("해당 제품의 가격이 업데이트 되었습니다");
        mockMvc.perform(patch("/products/{productId}",productId)
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsBytes(requestDto))
                        .accept(MediaType.APPLICATION_JSON)
                        .with(csrf())) // 요청
                .andExpect(status().isOk()); // 응답
    }

 

해당 코드에서 content 부분에 응답 값이 오는 줄 알고 content 쪽에 updateProduct의 반환값 -  ResponseEntity 혹은 StatusResponseEntity 등의 다른 반환 타입을 넣으려고 하다가 지속해서 아래의 오류 발생으로 테스트 실패

             Type = org.springframework.http.converter.HttpMessageNotReadableException

 후에 content에 들어가는 부분이 응답을 위한 반환값이 들어가는것이 아닌 요청에 들어온 값을 말한다는 것을 알게 되었고 해당 부분을 수정하니 해당 오류가 사라졌다.

 

rest docs 적용을 위한 기본적인 컨트롤러 테스트를 작성하였고 후에 해당 부분에 맞춰 rest docs의 사용이 결정되면 작성하려고 한다.

 

'기록 > TIL' 카테고리의 다른 글

[TIL] Today I Lerned - 230116  (0) 2023.01.16
[TIL] Today I Lerned - 230113  (0) 2023.01.14
[TIL] Today I Lerned - 230112  (0) 2023.01.12
[TIL] Today I Lerned - 230111  (0) 2023.01.11
[TIL] Today I Lerned - 230110  (0) 2023.01.10