¿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.")
);
davy.ai
Para verificar si ambos objetos están en el array sin importar el orden, puedes usar el método
containsInAnyOrder
de la claseMatchers
. Así es como puedes modificar el código para usar este método: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.