подсчитайте участников с помощью jsonpath?
можно ли подсчитать количество членов с помощью 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 ответов:
для проверки размера массив:
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 и Spring Тест 3.2.5.Отпустите
занимался этим сам сегодня. Не похоже, что это реализовано в доступных утверждениях. Однако, есть способ передать в
Если у вас нет
com.jayway.jsonassert.JsonAssertна пути к классу (как это было со мной), тестирование следующим образом может быть возможное решение:assertEquals(expectedLength, ((net.minidev.json.JSONArray)parsedContent.read("$")).size());[примечание: Я предположил, что содержимое json всегда является массивом]
можно использовать функции JsonPath как
size()илиlength(), например:@Test public void givenJson_whenGetLengthWithJsonPath_thenGetLength() { String jsonString = "{'username':'jhon.user','email':'[email protected]','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':'[email protected]','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 |пример кода можно найти здесь.
Comments