SpringMVC/mockMVC/jsonpath сравнивает список строк
В настоящее время я пишу некоторые модульные тесты для проекта Spring MVC.
Поскольку возвращаемым типом носителя является JSON, я пытаюсь использовать jsonPath для проверки правильности верных значений.
Проблема заключается в том, чтобы проверить, содержит ли список строк правильные (и только правильные) значения.
Мой план был:
- Убедитесь, что список имеет правильную длину
- Для каждого элемента, который должен быть возвращен, проверьте его в списке
К сожалению, ни одна из этих вещей не работает.
Здесь соответствующая часть моего кода:
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). Другие (по длине и содержанию) я могу крутить и поворачивать, но я хочу, они не дают мне полезного результата.
Любые предложения?
Ответы
Ответ 1
1) Вместо
.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.
Ответ 2
Вот что я в итоге использовал:
.andExpect(jsonPath('$.data.roles').value(Matchers.hasSize(size)))
и
.andExpect(jsonPath('$.data.roles').value(Matchers.containsInAnyOrder("role1", "role2", "role3")))