подсчитайте участников с помощью 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. Возможно ли это? Альтернативные решения также приветствуются.

623   4  

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.Отпустите

hasSize (int) javadoc

занимался этим сам сегодня. Не похоже, что это реализовано в доступных утверждениях. Однако, есть способ передать в

Если у вас нет 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

    Ничего не найдено.