[JUnit] SpringBoot에서 Junit5으로 Controller Response 테스트하기

 

 

1. Get 테스트하기

특성 속성(Key)의 데이터(value) 존재, 타입 확인

    @DisplayName("모든 정보를 조회한다")
    @FindWithMockUser
    @Test
    public void testFindAllInfo() throws Exception {

        mockMvc.perform(get(PREFIX)
                       .headers(headers))   // Token 등 필요한 header 첨부
               .andDo(print())
               .andExpect(status().isOk())  // 기대 상태값
               .andExpect(jsonPath("$.data[0].a").exists())  // 데이터 Value 존재 여부 확인
               .andExpect(jsonPath("$.data[0].b").isBoolean()) // 데이터 타입 확인
               .andExpect(jsonPath("$.data[0].c").hasJsonPath()); // 데이터 Path(Key) 존재 여부 확인
    }
MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = 생략
     Content type = application/json;charset=UTF-8
             Body = { ... 생략..., "data":[{"a":"aValue", "b" :"bValue", "c":null},...]}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

 

 

Matchers를 이용한 Response 값 확인

    private static final String PREFIX = "/api/v1/...";
    private static final String DATE_TIME_REGEX = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}";


	@DisplayName("특정 데이터 상세 정보 보기")
    @FindWithMockUser
    @Test
    public void testFindDataDetail() throws Exception {

        mockMvc.perform(get(PREFIX + "/" + "생략" + "/detail")
                       .headers(headers))
               .andDo(print())
               .andExpect(status().isOk())
               .andExpect(jsonPath("$.data.dtm").value(matchesPattern(DATE_TIME_REGEX)))
               .andExpect(jsonPath("$.data.uList", Matchers.hasSize(Matchers.greaterThan(0))))
    }
MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = 생략
     Content type = application/json;charset=UTF-8
             Body = { ... 생략..., "data":{"dtm":"2024-08-16 19:00:00", "uList":[{"ZA":"ZAValue","ZB":"ZBValue","ZCValue":null},{"ZA":"ZAValue","ZB":"ZBValue","ZC":null},...]}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

 

2. Get이외의 테스트

	privat static final UUID TEST_ID = "생략";

	@DisplayName("습득(주웠어요) 채팅을 생성한다")
    @FindWithMockUser(username = "3ee5f0fb-1f93-48e6-a5cd-ebeeee3d5eaa")
    @Transactional
    @Test
    public void testCreateFundChat() throws Exception {

        // given
        UUID id = TEST_ID;
        TestInput input = new TestInput();
        input.setId(id);

        // when-then
        mockMvc.perform(post(PREFIX + "/test")  // post Mapping
                       .contentType(MediaType.APPLICATION_JSON)  // contentType 지정
                       .content(objectMapper.writeValueAsString(input))) // Input 객체 삽입
               .andDo(print())
               // ... 생략
    }

contentType, content 필요에 따라 맞게 삽입