[*]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
[*]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.