Saltar al contenido

Cómo extraer valor de la respuesta JSON cuando se usa Spring MockMVC

[*]Si te encuentras con algo que no entiendes puedes comentarlo y te ayudaremos rápidamente.

Solución:

[*]Simplemente puedes usar JsonPath.read en el objeto de resultado:

MvcResult result = mockMvc.perform(post("/api/tracker/jobs/work")
    .contentType(TestUtil.APPLICATION_JSON_UTF8)
    .content(TestUtil.convertObjectToJsonBytes(workRequest)))
    .andExpect(status().isCreated())
    .andReturn();    

String id = JsonPath.read(result.getResponse().getContentAsString(), "$.id")

Work work = workService.findWorkById(id);

...

[*]He logrado resolver mi problema usando el controlador de resultados Spring MockMVC. Creé una utilidad de prueba para convertir el JSON string volver a un objeto y así permitirme obtener la identificación.

[*]Utilidad de conversión:

 public static   Object convertJSONStringToObject(String json, Class objectClass) throws IOException 
    ObjectMapper mapper = new ObjectMapper();
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

    JavaTimeModule module = new JavaTimeModule();
    mapper.registerModule(module);
    return mapper.readValue(json, objectClass);

[*]Prueba de unidad:

 @Test
@Transactional
public void createNewWorkWorkWhenCreatedJobItemAndQuantitiesPoolShouldBeCreated() throws Exception 

    mockMvc.perform(post("/api/tracker/jobs/work")
        .contentType(TestUtil.APPLICATION_JSON_UTF8)
        .content(TestUtil.convertObjectToJsonBytes(workRequest)))
        .andExpect(status().isCreated())
        .andDo(mvcResult -> 
            String json = mvcResult.getResponse().getContentAsString();
            workRequestResponse = (WorkRequestResponse) TestUtil.convertJSONStringToObject(json, WorkRequestResponse.class);
        );

    Work work = workService.findWorkById(workRequestResponse.getWorkId());

    assertThat(work.getJobItem().getJobItemName()).isEqualTo(workRequest.getJobItem().getJobItemName());
    assertThat(work.getJobItem().getQuantities()).hasSize(workRequest.getQuantities().size());
    assertThat(work.getJobItem().getQuantityPools()).hasSize(workRequest.getQuantities().size());

[*]Una forma de recuperar un valor genérico arbitrario de la respuesta JSON es aprovechar el comparador jsonPath () de la biblioteca MockMVC y acoplarlo con un comparador personalizado que captura todos los valores que se le pide que coincida.

[*]Primero, el comparador personalizado:

import org.hamcrest.BaseMatcher;

/**
 * Matcher which always returns true, and at the same time, captures the
 * actual values passed in for matching. These can later be retrieved with a
 * call to @link #getLastMatched() or @link #getAllMatched().
 */
public static class CapturingMatcher extends BaseMatcher 

    private List matchedList = new ArrayList<>();

    @Override
    public boolean matches(Object matched) 
        matchedList.add(matched);
        return true;
    

    @Override
    public void describeTo(Description description) 
        description.appendText("any object");
    

    /**
     * The last value matched.
     */
    public Object getLastMatched() 
        return matchedList.get(matchedList.size() - 1);
    

    /**
     * All the values matched, in the order they were requested for
     * matching.
     */
    public List getAllMatched() 
        return Collections.unmodifiableList(matchedList);
    


[*]Ahora, use el comparador personalizado para capturar valores y use el comparador jsonPath () para identificar qué se debe capturar:

@Test
@WithMockUser(username = "reviewer", authorities = ROLE_USER)
public void testGetRemediationAction() throws Exception 

    CapturingMatcher capturingMatcher = new CapturingMatcher();

    // First request a list of all the available actions
    mvc.perform(get("/api/remediation/action").accept(VERSION_1_JSON))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.content[*].remediations[*].id", hasSize(12)))
            .andExpect(jsonPath("$.content[*].remediations[*].id", capturingMatcher));

    // Grab an ID from one of the available actions
    Object idArray = capturingMatcher.getLastMatched();
    assertThat(idArray).isInstanceOf(JSONArray.class);
    JSONArray jsonIdArray = (JSONArray) idArray;
    String randomId = (String) jsonIdArray.get(new Random().nextInt(12));

    // Now retrieve the chosen action
    mvc.perform(get("/api/remediation/action/" + randomId).accept(VERSION_1_JSON))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.id", is(randomId)));

Valoraciones y comentarios

[*]Acuérdate de que puedes optar por la opción de añadir una puntuación correcta si acertaste tu traba en el momento justo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Respuestas a preguntas comunes sobre programacion y tecnología