es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo emparejar objetos en un arreglo sin un orden específico en JsonPath?

Estoy trabajando con Spring y MockMvc. Estoy escribiendo una prueba unitaria para una respuesta específica del controlador. Se ve algo así:

{
  "errors": [
    {
      "error": "Falló la validación del bean.",
      "message": "Bean: UserRegistrationDto. Clase/campo: userRegistrationDto. Restricción: SafePseudonym."
    },
    {
      "error": "Falló la validación del bean.",
      "message": "Bean: UserRegistrationDto. Clase/campo: addressLine1. Restricción: NotNull."
    }
  ]
}

No se garantiza el orden del arreglo errors. Esto se debe en parte al SmartValidator de Spring. Me gustaría verificar si ambos objetos están en el arreglo, sin importar el orden.

Aquí está mi código actual:

mvc.perform(post("/registration")
        .contentType(MediaType.APPLICATION_JSON)
        .content(objectMapper.writeValueAsString(validExampleUserRegistrationDtoBuilder().addressLine1(null).pseudonym("oyasuna").build())))
    .andDo(result -> System.out.println(result.getResponse().getContentAsString()))
    .andExpect(status().isBadRequest())
    .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
    .andExpect(jsonPath("$.errors.length()").value(2))
    .andExpectAll(
        jsonPath("$.errors[0].error").value("Falló la validación del bean."),
        jsonPath("$.errors[0].message").value("Bean: UserRegistrationDto. Clase/campo: addressLine1. Restricción: NotNull.")
    )
    .andExpectAll(
        jsonPath("$.errors[1].error").value("Falló la validación del bean."),
        jsonPath("$.errors[1].message").value("Bean: UserRegistrationDto. Clase/campo: userRegistrationDto. Restricción: SafePseudonym.")
    );
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para verificar si ambos objetos están en el array sin importar el orden, puedes usar el método containsInAnyOrder de la clase Matchers. Así es como puedes modificar el código para usar este método:

    mvc.perform(post("/registration")
            .contentType(MediaType.APPLICATION_JSON)
            .content(objectMapper.writeValueAsString(validExampleUserRegistrationDtoBuilder().addressLine1(null).pseudonym("oyasuna").build())))
        .andDo(result -> System.out.println(result.getResponse().getContentAsString()))
        .andExpect(status().isBadRequest())
        .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
        .andExpect(jsonPath("$.errors.length()").value(2))
        .andExpect(jsonPath("$.errors[*].error", containsInAnyOrder("Error de validación de Bean.", "Error de validación de Bean.")))
        .andExpect(jsonPath("$.errors[*].message", containsInAnyOrder("Bean: UserRegistrationDto. Clase/campo: userRegistrationDto. Restricción: SafePseudonym.", "Bean: UserRegistrationDto. Clase/campo: addressLine1. Restricción: NotNull.")));
    

    Con esta modificación, el test verificará si el array errors contiene ambos objetos sin importar su orden, siempre y cuando ambos objetos estén presentes.

Comments are closed.