120

JsonPath を使用してメンバー数をカウントすることはできますか?

spring mvc testを使用して、生成するコントローラーをテストしています

{"foo": "oof", "bar": "rab"}

standaloneSetup(new FooController(fooService)).build()
            .perform(get("/something").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
            .andExpect(jsonPath("$.foo").value("oof"))
            .andExpect(jsonPath("$.bar").value("rab"));

生成されたjsonに他のメンバーが存在しないことを確認したいと思います。うまくいけば、jsonPath を使用してそれらをカウントします。出来ますか?代替ソリューションも大歓迎です。

4

5 に答える 5

283

配列のサイズをテストするには:jsonPath("$", hasSize(4))

objectのメンバーを数えるには:jsonPath("$.*", hasSize(4))


つまり、API が4 つの項目の配列を返すことをテストするには:

受け入れられる値:[1,2,3,4]

mockMvc.perform(get(API_URL))
       .andExpect(jsonPath("$", hasSize(4)));

API が2 つのメンバーを含むオブジェクトを返すことをテストします。

受け入れられる値:{"foo": "oof", "bar": "rab"}

mockMvc.perform(get(API_URL))
       .andExpect(jsonPath("$.*", hasSize(2)));

Hamcrest バージョン 1.3 と Spring Test 3.2.5.RELEASE を使用しています

hasSize(int) javadoc

注: hamcrest-library 依存関係を含めimport static org.hamcrest.Matchers.*;、hasSize() が機能するようにする必要があります。

于 2013-12-10T15:52:04.063 に答える
21

jsonpath 内のメソッドを使用することもできるので、代わりに

mockMvc.perform(get(API_URL))
   .andExpect(jsonPath("$.*", hasSize(2)));

できるよ

mockMvc.perform(get(API_URL))
   .andExpect(jsonPath("$.length()", is(2)));
于 2018-11-22T14:42:04.223 に答える
4

今日は自分でこれを扱っています。これが利用可能なアサーションに実装されているようには見えません。ただし、org.hamcrest.Matcherオブジェクトを渡すメソッドがあります。これにより、次のようなことができます。

final int count = 4; // expected count

jsonPath("$").value(new BaseMatcher() {
    @Override
    public boolean matches(Object obj) {
        return obj instanceof JSONObject && ((JSONObject) obj).size() == count;
    }

    @Override
    public void describeTo(Description description) {
        // nothing for now
    }
})
于 2012-12-28T23:33:42.470 に答える
0

クラスパスにないcom.jayway.jsonassert.JsonAssert場合 (私の場合)、次の方法でテストすることが回避策になる可能性があります。

assertEquals(expectedLength, ((net.minidev.json.JSONArray)parsedContent.read("$")).size());

[注: json の内容は常に配列であると仮定しました]

于 2015-11-27T20:55:35.493 に答える