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.
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.*;
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
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);
}