SpringMVC/ mockMVC/ jsonpath compare list of strings

♀尐吖头ヾ 提交于 2019-11-28 22:21:33

问题


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?


回答1:


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.




回答2:


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



来源:https://stackoverflow.com/questions/15371022/springmvc-mockmvc-jsonpath-compare-list-of-strings

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!