Reputation: 806
I am currently writing some unit tests for a Spring MVC project. As the returned media type is JSON, I try to use jsonPath to check if the correct values are returned.
The trouble I have is to verify if a list of strings contains the correct (and only the correct) values.
My Plan was:
sadly, none of these things seem to work.
Here's the relevant part of my 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());
Only the first two "expectations" (isOk & isArray) are working. The other ones (for length and content) I can twist and turn however I want, they're not giving me any useful result.
Any suggestions?
Upvotes: 42
Views: 68067
Reputation: 1232
1) Instead of
.andExpect(jsonPath("$.data.roles.length").value(correctRoles.size()));
try
.andExpect(jsonPath("$.data.roles.length()").value(correctRoles.size()));
or
.andExpect((jsonPath("$.data.roles", Matchers.hasSize(size))));
2) Instead of
for (AuthorityRole role : correctRoles) // doesn't work
actions.andExpect(jsonPath("$.data.roles[?(@=='%s')]", role.toString()).exists());
try
actions.andExpect((jsonPath("$.data.roles", Matchers.containsInAnyOrder("role1", "role2", "role3"))));
Keep in mind that you have to add hamcrest-library.
Upvotes: 88
Reputation: 2025
Here is what I ended up using:
.andExpect(jsonPath('$.data.roles').value(Matchers.hasSize(size)))
and
.andExpect(jsonPath('$.data.roles').value(Matchers.containsInAnyOrder("role1", "role2", "role3")))
Upvotes: 6