web-dev-qa-db-fra.com

Comment vérifier JSON dans le corps de la réponse avec mockMvc

C'est ma méthode à l'intérieur de mon contrôleur qui est annotée par @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;
    }

Je m'attends à {"data":[{"useRegEx":"false","hosts":"v2v2v2"}]} Comme json.

Et voici mon test 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();
        }
    }

Voici la sortie de la console:

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

Même result.getResponse().getContentAsString() est une chaîne vide.

Quelqu'un peut-il s'il vous plaît suggérer comment obtenir mon JSON dans ma méthode de test JUnit afin que je puisse terminer mon cas de test.

28
Zeeshan

J'utilise TestNG pour mes tests unitaires. Mais dans Spring Test Framework, ils ont tous deux la même apparence. Je crois donc que ton test est comme ci-dessous

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

Si vous voulez vérifier la valeur et la clé json, vous pouvez utiliser jsonpath .andExpect(jsonPath("$.yourKeyValue", is("WhatYouExpect")));

Vous pourriez trouver quecontent().json() ne sont pas résolus, veuillez ajouter

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

23
Menuka Ishan

Le code de statut 406 Not Acceptable Signifie que Spring n'a pas pu convertir l'objet en json. Vous pouvez obliger votre méthode de contrôleur à retourner une chaîne et faire return json.toString(); ou configurer votre propre HandlerMethodReturnValueHandler. Cochez cette question similaire Retour de JsonObject en utilisant @ResponseBody dans SpringMVC

10
medvedev1088

Vous pouvez essayer les méthodes ci-dessous pour get et 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))); 
}

Si la réponse est vide, veillez à remplacer les méthodes equals() et hashCode() sur le Entity utilisé par votre référentiel:

//Converts Object to Json String
private String convertObjectToJsonString(Muffin muffin) throws JsonProcessingException{
    ObjectWriter writer = new ObjectWriter().writer().withDefaultPrettyPrinter();
    return writer.writeValueAsString(muffin);
}
1
Nagaraj