복붙노트

[SPRING] mockMvc를 사용하여 응답 본문에서 JSON을 확인하는 방법

SPRING

mockMvc를 사용하여 응답 본문에서 JSON을 확인하는 방법

이것은 @Controller에 의해 주석이 달린 컨트롤러 내 메서드입니다.

@RequestMapping(value = "/getServerAlertFilters/{serverName}/", produces = "application/json; charset=utf-8")
    @ResponseBody
    public JSONObject getServerAlertFilters(@PathVariable String serverName) {
        JSONObject json = new JSONObject();
        List<FilterVO> filteredAlerts = alertFilterService.getAlertFilters(serverName, "");
        JSONArray jsonArray = new JSONArray();
        jsonArray.addAll(filteredAlerts);
        json.put(SelfServiceConstants.DATA, jsonArray);
        return json;
    }

내 json으로 { "data": [{ "useRegEx": "false", "hosts": "v2v2v2"}]}를 기대합니다.

그리고 이것은 내 JUnit 테스트입니다.

@Test
    public final void testAlertFilterView() {       
        try {           
            MvcResult result = this.mockMvc.perform(get("/getServerAlertFilters/v2v2v2/").session(session)
                    .accept("application/json"))
                    .andDo(print()).andReturn();
            String content = result.getResponse().getContentAsString();
            LOG.info(content);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

다음은 콘솔 출력입니다.

MockHttpServletResponse:
              Status = 406
       Error message = null
             Headers = {}
        Content type = null
                Body = 
       Forwarded URL = null
      Redirected URL = null
             Cookies = []

심지어 result.getResponse (). getContentAsString ()은 빈 문자열입니다.

누군가 제 JUnit 테스트 메소드에서 JSON을 얻는 방법을 제안하여 테스트 케이스를 완료 할 수 있습니까?

해결법

  1. ==============================

    1.내 단위 테스트를 위해 TestNG를 사용합니다. 그러나 Spring Test Framework에서는 둘 다 비슷하게 보입니다. 그래서 네 시험이 아래 같아 질거야.

    내 단위 테스트를 위해 TestNG를 사용합니다. 그러나 Spring Test Framework에서는 둘 다 비슷하게 보입니다. 그래서 네 시험이 아래 같아 질거야.

    @Test
    public void testAlertFilterView() throws Exception {
        this.mockMvc.perform(get("/getServerAlertFilters/v2v2v2/").
                .andExpect(status().isOk())
                .andExpect(content().json("{'data':[{'useRegEx':'false','hosts':'v2v2v2'}]}"));
        }
    

    json 키와 값을 확인하려면 jsonpath를 사용할 수 있습니다. .andExpect (jsonPath ( "$. yourKeyValue"는 ( "WhatYouExpect"))));

    thatcontent () .json ()이 해결되지 않았다는 것을 알 수 있습니다.

    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. *;

  2. ==============================

    2.406 Not Acceptable 상태 코드는 Spring이 객체를 json으로 변환 할 수 없다는 것을 의미합니다. 컨트롤러 메소드가 String을 반환하도록 만들고 json.toString ();을 반환 할 수 있습니다. 또는 자신의 HandlerMethodReturnValueHandler를 구성하십시오. 이 유사한 질문을 확인하십시오 SpringMVC에서 @ResponseBody를 사용하여 JsonObject 반환하기

    406 Not Acceptable 상태 코드는 Spring이 객체를 json으로 변환 할 수 없다는 것을 의미합니다. 컨트롤러 메소드가 String을 반환하도록 만들고 json.toString ();을 반환 할 수 있습니다. 또는 자신의 HandlerMethodReturnValueHandler를 구성하십시오. 이 유사한 질문을 확인하십시오 SpringMVC에서 @ResponseBody를 사용하여 JsonObject 반환하기

  3. ==============================

    3.get 및 post 메소드에 대해 아래에서 시도 할 수 있습니다.

    get 및 post 메소드에 대해 아래에서 시도 할 수 있습니다.

    @Autowired
    private MuffinRepository muffinRepository;
    
    @Test
    public void testgetMethod throws Exception(){
        Muffin muffin = new Muffin("Butterscotch");
        muffin.setId(1L);
    
        BddMockito.given(muffinRepository.findOne(1L)).
            willReturn(muffin);
    
        mockMvc.perform(MockMvcRequestBuilders.
            get("/muffins/1")).
            andExpect(MockMvcResutMatchers.status().isOk()).
            andExpect(MockMvcResutMatchers.content().string("{\"id\":1, "flavor":"Butterscotch"}"));    
    }
    
    //Test to do post operation
    @Test
    public void testgetMethod throws Exception(){
        Muffin muffin = new Muffin("Butterscotch");
        muffin.setId(1L);
    
        BddMockito.given(muffinRepository.findOne(1L)).
            willReturn(muffin);
    
        mockMvc.perform(MockMvcRequestBuilders.
            post("/muffins")
            .content(convertObjectToJsonString(muffin))
            .contentType(MediaType.APPLICATION_JSON)
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(MockMvcResutMatchers.status().isCreated())
            .andExpect(MockMvcResutMatchers.content().json(convertObjectToJsonString(muffin))); 
    }
    

    응답이 비어 있으면 리포지토리가 작동하는 Entity에서 equals () 및 hashCode () 메서드를 재정의해야합니다.

    //Converts Object to Json String
    private String convertObjectToJsonString(Muffin muffin) throws JsonProcessingException{
        ObjectWriter writer = new ObjectWriter().writer().withDefaultPrettyPrinter();
        return writer.writeValueAsString(muffin);
    }
    
  4. from https://stackoverflow.com/questions/30482934/how-to-check-json-in-response-body-with-mockmvc by cc-by-sa and MIT license