공부기록/SPRING

[JUnit] Required String parameter '???' is not present

또리머 2023. 1. 4. 16:11
반응형

code:400

message:HTTP Status 400 - Required String parameter 'page' is not present

(JUnit 5.8.2)


원인: 파라미터가 올바르게 들어오지 않았을 때

여러 경우가 있다. 나같은 경우 ↓

테스트 대상 핸들러 메서드(getMemebers())의 파라미터는 @RequestParam 으로 받아주는데

나는 Json으로 변환해서 RequestBody로 넣어주고 있었다.

테스트 대상 (getMemebers())

//수정 전
    @Test
    void getMembersTest() throws Exception {
        Map<String, String> map = new HashMap<>();
        map.put("page", "1");
        map.put("size", "10");
        
        String content = gson.toJson(map);
        
        mockMvc.perform(get("/v11/members/")
                .accept(MediaType.APPLICATION_JSON)
                .contentType(MediaType.APPLICATION_JSON)
                .content(content)) // 여기
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.data").isArray());
    }

 


해결 (1) content 대신 param을 사용해주었다.

//수정 후 (1)
    @Test
    void getMembersTest() throws Exception {
        
        mockMvc.perform(get("/v11/members/")
                .accept(MediaType.APPLICATION_JSON)
                // .content(content)) 수정
                .param("page", "1")	// param
                .param("size", "10"))	// param
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.data").isArray());
    }

해결 (2)  params와 MultiValueMap을 사용해준다.

MockHttpServletRequestBuilder의 params

 

//수정 후 (2)
    @Test
    void getMembersTest() throws Exception {
        // MultiValueMap(params) 생성
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("page", "1");
        params.add("size", "10");
        
        mockMvc.perform(get("/v11/members/")
                .accept(MediaType.APPLICATION_JSON)
                .params(params)) // params
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.data").isArray());
    }
반응형