是否有可能使用计数成员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。 可能吗? 替代解决方案也欢迎。
为了测试数组的大小: 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()工作。
今天已经与这个自己处理。 它似乎并不像这是在可断言实现。 然而,在通过方法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
}
})
我们可以使用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 |
示例代码可以发现在这里 。
如果你没有com.jayway.jsonassert.JsonAssert
在classpath(这是情况和我),以下列方式测试可能是一个可能的解决方法:
assertEquals(expectedLength, ((net.minidev.json.JSONArray)parsedContent.read("$")).size());
[注:我假定JSON的含量始终是一个数组]
您还可以使用jsonpath里面的方法,所以不是
mockMvc.perform(get(API_URL))
.andExpect(jsonPath("$.*", hasSize(2)));
你可以做
mockMvc.perform(get(API_URL))
.andExpect(jsonPath("$.length()", is(2)));