算上与jsonpath成员?(count members with jsonpath?)

2019-07-04 15:51发布

是否有可能使用计数成员JsonPath的数量?

使用Spring MVC的测试我测试生成控制器

{"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。 可能吗? 替代解决方案也欢迎。

Answer 1:

为了测试数组的大小: jsonPath("$", hasSize(4))

要计算对象的成员: 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版和弹簧试验3.2.5.RELEASE

hasSize(INT)的Javadoc

注意:您需要包括hamcrest库的依赖和import static org.hamcrest.Matchers.*; 对于hasSize()工作。



Answer 2:

今天已经与这个自己处理。 它似乎并不像这是在可断言实现。 然而,在通过方法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
    }
})


Answer 3:

我们可以使用JsonPath功能一样size()length()就像这样:

@Test
public void givenJson_whenGetLengthWithJsonPath_thenGetLength() {
    String jsonString = "{'username':'jhon.user','email':'jhon@company.com','age':'28'}";

    int length = JsonPath
        .parse(jsonString)
        .read("$.length()");

    assertThat(length).isEqualTo(3);
}

或者干脆解析来net.minidev.json.JSONObject并获得大小:

@Test
public void givenJson_whenParseObject_thenGetSize() {
    String jsonString = "{'username':'jhon.user','email':'jhon@company.com','age':'28'}";

    JSONObject jsonObject = (JSONObject) JSONValue.parse(jsonString);

    assertThat(jsonObject)
        .size()
        .isEqualTo(3);
}

事实上,第二个方法看起来进行比第一个更好的。 我做了一个JMH性能测试,我得到以下结果:

| Benchmark                                       | Mode  | Cnt | Score       | Error        | Units |
|-------------------------------------------------|-------|-----|-------------|--------------|-------|
| JsonPathBenchmark.benchmarkJSONObjectParse      | thrpt | 5   | 3241471.044 | ±1718855.506 | ops/s |
| JsonPathBenchmark.benchmarkJsonPathObjectLength | thrpt | 5   | 1680492.243 | ±132492.697  | ops/s |

示例代码可以发现在这里 。



Answer 4:

如果你没有com.jayway.jsonassert.JsonAssert在classpath(这是情况和我),以下列方式测试可能是一个可能的解决方法:

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

[注:我假定JSON的含量始终是一个数组]



Answer 5:

您还可以使用jsonpath里面的方法,所以不是

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

你可以做

mockMvc.perform(get(API_URL))
   .andExpect(jsonPath("$.length()", is(2)));


文章来源: count members with jsonpath?