Подтвердить что ты не робот

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). Другие (по длине и содержанию) я могу крутить и поворачивать, но я хочу, они не дают мне полезного результата.

Любые предложения?

4b9b3361

Ответ 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")))