現在、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());
最初の2つの「期待」(isOkとisArray)のみが機能しています。他のもの(長さと内容について)私は好きなようにねじれたり回転したりできますが、有用な結果は得られません。
助言がありますか?
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を追加する必要があることに注意してください。
これが私が最終的に使用したものです:
.andExpect(jsonPath('$.data.roles').value(Matchers.hasSize(size)))
そして
.andExpect(jsonPath('$.data.roles').value(Matchers.containsInAnyOrder("role1", "role2", "role3")))