web-dev-qa-db-ja.com

SpringのmockMvcを使用して、返されたデータに文字列の一部が含まれているかどうかを確認するにはどうすればよいですか?

Spring 3.2.11.RELEASEとJUnit 4.11を使用しています。 Spring mockMvcフレームワークを使用して、JSONデータを返すメソッドに特定のJSON要素が含まれているかどうかを確認するにはどうすればよいですか?私が持っています

    mockMvc.perform(get("/api/users/" + id))
        .andExpect(status().isOk())
        .andExpect(content().string("{\"id\":\"" + id + "\"}")); 

ただし、これは返された文字列と完全に一致するかどうかをチェックし、JSON文字列にローカルフィールド「id」に含まれる値が含まれているかどうかを確認します。

11
Dave

文字列の代わりにHamcrest Matcherを渡すことができるようです。次のようになります:

mockMvc.perform(get("/api/users/" + id))
    .andExpect(status().isOk())
    .andExpect(content().string(org.hamcrest.Matchers.containsString("{\"id\":\"" + id + "\"}"))); 
20
unigeek

他の方法で比較または操作できるように、mockMVC要求の文字列応答に到達できる別の方法は次のとおりです。

MvcResult result = mockMvc.perform(get("/api/users/" + id))
    .andExpect(status().isOk())
    .andReturn();
String stringResult = result.getResponse().getContentAsString();
boolean doesContain = stringResult.contains("{\"id\":\"" + id + "\"}");

Stringメソッドを使用しながら、すべてをassertTrueでラップすることもできます。

assertTrue(mockMvc.perform(get("/api/users/" + id))
    .andExpect(status().isOk())
    .andReturn()
    .getResponse()
    .getContentAsString()
    .contains("{\"id\":\"" + id + "\"}");

私は承認された答えを好みますが、これを別の選択肢として提出するつもりでした。

4
Matt Trax

そのためのより適切な方法は次のとおりです。

mockMvc.perform(get("/api/users/" + id))
    .andExpect(status().isOk())
    .andExpect(jsonPath("$.id", org.hamcrest.Matchers.is(id)));
3
Jean-Christophe