web-dev-qa-db-ja.com

SpringMVC / mockMVC / jsonpath文字列のリストを比較

現在、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());

最初の2つの「期待」(isOkとisArray)のみが機能しています。他のもの(長さと内容について)私は好きなようにねじれたり回転したりできますが、有用な結果は得られません。

助言がありますか?

26
Martin Keßler

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-libraryを追加する必要があることに注意してください。

56
chaldaean

これが私が最終的に使用したものです:

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

そして

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

3
jndietz