J'écris actuellement des tests unitaires pour un projet Spring MVC. Comme le type de média retourné est JSON, j'essaie d'utiliser jsonPath pour vérifier si les valeurs correctes sont retournées.
Le problème que j'ai est de vérifier si une liste de chaînes contient les valeurs correctes (et uniquement les bonnes).
Mon plan était:
malheureusement, aucune de ces choses ne semble fonctionner.
Voici la partie pertinente de mon code:
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());
Seules les deux premières "attentes" (isOk & isArray) fonctionnent. Les autres (pour la longueur et le contenu) je peux tourner et tourner comme je veux, ils ne me donnent aucun résultat utile.
Aucune suggestion?
1) Au lieu de
.andExpect(jsonPath("$.data.roles.length").value(correctRoles.size()));
essayer
.andExpect(jsonPath("$.data.roles.length()").value(correctRoles.size()));
ou
.andExpect((jsonPath("$.data.roles", Matchers.hasSize(size))));
2) Au lieu de
for (AuthorityRole role : correctRoles) // doesn't work
actions.andExpect(jsonPath("$.data.roles[?(@=='%s')]", role.toString()).exists());
essayer
actions.andExpect((jsonPath("$.data.roles", Matchers.containsInAnyOrder("role1", "role2", "role3"))));
Gardez à l'esprit que vous devez ajouter la bibliothèque hamcrest.
Voici ce que j'ai fini par utiliser:
.andExpect(jsonPath('$.data.roles').value(Matchers.hasSize(size)))
et
.andExpect(jsonPath('$.data.roles').value(Matchers.containsInAnyOrder("role1", "role2", "role3")))