SpringMVC / mockMVC / jsonpath сравнить список строк

17

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

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

    
задан Martin Keßler 12.03.2013 в 21:03
источник

2 ответа

40

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.

    
ответ дан chaldaean 13.03.2013 в 10:57
источник
0

Вот что я в итоге использовал:

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

и

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

ответ дан jndietz 20.02.2017 в 22:10
источник