java - framework - spring mvc test mockito
Cómo verificar JSON en cuerpo de respuesta con mockMvc (3)
Este es mi método dentro de mi controlador que está anotado por @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;
}
Estoy esperando {"data":[{"useRegEx":"false","hosts":"v2v2v2"}]}
como mi json.
Y esta es mi prueba de 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();
}
}
Aquí está la salida de la consola:
MockHttpServletResponse:
Status = 406
Error message = null
Headers = {}
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []
Incluso result.getResponse().getContentAsString()
es una cadena vacía.
¿Alguien puede sugerir cómo obtener mi JSON en mi método de prueba JUnit para que pueda completar mi caso de prueba?
El código de estado 406 Not Acceptable
significa que Spring no pudo convertir el objeto a json. Puede hacer que su método de controlador devuelva un String y return json.toString();
o configure su propio HandlerMethodReturnValueHandler
. Marque esta pregunta similar Devolviendo JsonObject usando @ResponseBody en SpringMVC
Puedes probar lo siguiente para obtener y publicar métodos.
@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 respuesta está vacía, asegúrese de anular los métodos equals()
y hashCode()
en la Entity
con la que trabaja su repositorio:
//Converts Object to Json String
private String convertObjectToJsonString(Muffin muffin) throws JsonProcessingException{
ObjectWriter writer = new ObjectWriter().writer().withDefaultPrettyPrinter();
return writer.writeValueAsString(muffin);
}
Yo uso TestNG para la prueba de mi unidad. Pero en Spring Test Framework ambos se ven similares. Así que creo que tu prueba será como la de abajo.
@Test
public void testAlertFilterView() throws Exception {
this.mockMvc.perform(get("/getServerAlertFilters/v2v2v2/").
.andExpect(status().isOk())
.andExpect(content().json("{''data'':[{''useRegEx'':''false'',''hosts'':''v2v2v2''}]}"));
}
Si desea verificar la clave y el valor de json, puede usar jsonpath .andExpect(jsonPath("$.yourKeyValue", is("WhatYouExpect")));
Es posible que el content().json()
no se pueda resolver, agregue
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;