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 ответа

43

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.

    
ответ дан chaldaean 13.03.2013 в 10:57
  • Большое спасибо! Это очень помогло! –  Martin Keßler 15.03.2013 в 18:51
  • Если это помогло, вы можете пометить мой ответ как принятый :) –  chaldaean 16.03.2013 в 12:54
  • @chaldaean Какую библиотеку hamcrest вы используете? В том, что у меня есть, hamcrest-all-1.1, класс org.hamcrest.Matchers не содержит методов hasSize и containsInAnyOrder. –  Ludwig Magnusson 05.06.2013 в 09:23
  • Эта одна библиотека hamcrest 1.2.1 –  chaldaean 05.06.2013 в 13:27
  • Для полноты, к методу значений также можно добавить Hamcrest Matchers, поэтому andExpect (значение jsonPath («$. data.roles»). (Matchers.containsInAnyOrder (items ...)) является законным. –  Rythmic 28.10.2013 в 17:52
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