Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SpringMVC/ mockMVC/ jsonpath compare list of strings

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:

  1. Check that the list has the correct length
  2. For each element that's supposed to be returned, check whether it's in the list

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?

like image 383
Martin Keßler Avatar asked Mar 12 '13 20:03

Martin Keßler


1 Answers

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.

like image 166
chaldaean Avatar answered Oct 02 '22 22:10

chaldaean