java - mockmvcresultmatchers - spring test andexpect json
SpringMVC/mockMVC/jsonpath compara la lista de cadenas (2)
1) En lugar de
.andExpect(jsonPath("$.data.roles.length").value(correctRoles.size()));
tratar
.andExpect(jsonPath("$.data.roles.length()").value(correctRoles.size()));
o
.andExpect((jsonPath("$.data.roles", Matchers.hasSize(size))));
2) En lugar de
for (AuthorityRole role : correctRoles) // doesn''t work
actions.andExpect(jsonPath("$.data.roles[?(@==''%s'')]", role.toString()).exists());
tratar
actions.andExpect((jsonPath("$.data.roles", Matchers.containsInAnyOrder("role1", "role2", "role3"))));
Ten en cuenta que debes agregar hamcrest-library.
Actualmente estoy escribiendo algunas pruebas unitarias para un proyecto Spring MVC. Como el tipo de medio devuelto es JSON, trato de usar jsonPath para verificar si se devuelven los valores correctos.
El problema que tengo es verificar si una lista de cadenas contiene los valores correctos (y solo los correctos).
Mi plan era:
- Compruebe que la lista tiene la longitud correcta
- Para cada elemento que debe devolverse, verifique si está en la lista
Lamentablemente, ninguna de estas cosas parece funcionar.
Aquí está la parte relevante de mi código:
Collection<AuthorityRole> correctRoles = magicDataSource.getRoles();
ResultActions actions = this.mockMvc.perform(get("/accounts/current/roles").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()) // works
.andExpect(jsonPath("$.data.roles").isArray()) // works
.andExpect(jsonPath("$.data.roles.length").value(correctRoles.size())); // doesn''t work
for (AuthorityRole role : correctRoles) // doesn''t work
actions.andExpect(jsonPath("$.data.roles[?(@==''%s'')]", role.toString()).exists());
Solo las dos primeras "expectativas" (isOk & isArray) están funcionando. Los otros (por longitud y contenido) puedo girar y girar como yo quiera, no me están dando ningún resultado útil.
¿Alguna sugerencia?
Esto es lo que terminé usando:
.andExpect(jsonPath(''$.data.roles'').value(Matchers.hasSize(size)))
y
.andExpect(jsonPath(''$.data.roles'').value(Matchers.containsInAnyOrder("role1", "role2", "role3")))