33

現在、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) のみが機能しています。他のもの (長さと内容) は、好きなようにひねって回すことができますが、有用な結果は得られません。

助言がありますか?

4

2 に答える 2

80

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

于 2013-03-13T09:57:54.793 に答える