web-dev-qa-db-fra.com

SpringMVC / mockMVC / jsonpath compare la liste des chaînes

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:

  1. Vérifiez que la liste a la bonne longueur
  2. Pour chaque élément censé être retourné, vérifiez s'il se trouve dans la liste

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?

26
Martin Keßler

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.

56
chaldaean

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")))

3
jndietz