test mvc framework example java spring junit mocking spring-test-mvc

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