用SpringMVC / mockMVC / jsonpath比较字符串列表(SpringMVC/

2019-07-21 11:13发布

我目前正在写一个Spring MVC的项目的一些单元测试。 由于返回的媒体类型是JSON,我尝试使用jsonPath检查是否返回正确的值。

我有麻烦的是,以验证字符串列表包含正确的(也是唯一正确的)值。

我的计划是:

  1. 检查列表中有正确的长度
  2. 对于数字应返回的每个元素,检查它是否是列表

可悲的是,没有这些东西似乎工作。

这里是我的代码的相关部分:

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());

只有前两个“预期”(ISOK&IsArray的)都在工作。 其他的人(长度和内容)我可以扭曲和不过,我想转,他们没有给我任何有用的结果。

有什么建议?

Answer 1:

1)替代

.andExpect(jsonPath("$.data.roles.length").value(correctRoles.size()));

尝试

.andExpect(jsonPath("$.data.roles.length()").value(correctRoles.size()));

要么

.andExpect((jsonPath("$.data.roles", Matchers.hasSize(size))));

2)替代

for (AuthorityRole role : correctRoles) // doesn't work
  actions.andExpect(jsonPath("$.data.roles[?(@=='%s')]", role.toString()).exists());

尝试

actions.andExpect((jsonPath("$.data.roles", Matchers.containsInAnyOrder("role1", "role2", "role3"))));

请记住,你必须添加hamcrest库。



Answer 2:

以下是我最终使用:

.andExpect(jsonPath('$.data.roles').value(Matchers.hasSize(size)))

.andExpect(jsonPath('$.data.roles').value(Matchers.containsInAnyOrder("role1", "role2", "role3")))



文章来源: SpringMVC/ mockMVC/ jsonpath compare list of strings