Spring MVC Test с Hamcrest и JsonPath: как подсчитать размер тела? (не считать участников)

Я работаю с:

  • Весенний MVC-тест
  • Хэмкрест
  • JsonPath

У меня есть следующий ответ от сервера:

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = {Content-Type=[application/json;charset=UTF-8]}
     Content type = application/json;charset=UTF-8
             Body = {
  "id" : "100",
  "nombre" : "Jesús Você",
  "apellido" : "Mão Nuñez",
  "fecha" : "1977-12-08"
}
    Forwarded URL = null
   Redirected URL = null

Следующее работает, как и ожидалось (действительно):

 .andExpect(jsonPath("$").exists())
 .andExpect(jsonPath("$", notNullValue()))
 .andExpect(jsonPath("$", isA(LinkedHashMap.class)))

 .andExpect(jsonPath("$.*").exists())
 .andExpect(jsonPath("$.*", notNullValue()))
 .andExpect(jsonPath("$.*", isA(JSONArray.class)))
 .andExpect(jsonPath("$.*", hasSize(is(4))))

Мне нужно проверить, что ("$") равно 1. Подтвердите существование 1 элемента. Это еще раз подтвердить следующее:

Body = {
      "id" : "100",
      "nombre" : "Jesús Você",
      "apellido" : "Mão Nuñez",
      "fecha" : "1977-12-08"
    }

Я пробовал:

.andExpect(jsonPath("$", hasSize(is(1))))

Обратите внимание на разницу между $ и $.*, для последнего я знаю, что он подсчитывает количество полей. Но от первого я всегда получаю:

java.lang.AssertionError: JSON path "$"
Expected: a collection with size is <1>
     but: was <{id=100, nombre=Jesús Você, apellido=Mão Nuñez, fecha=1977-12-08}>
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18

«Кажется», данные не являются коллекцией, но помните, что .andExpect(jsonPath("$", isA(LinkedHashMap.class))) проходит. Я как-то запутался.

Следовательно, можно проверить, что ("$") равно 1.? Если да, то как?

Я прочитал подсчет участников с помощью jsonpath?

И говорит:

Чтобы проверить размер массива: jsonPath("$", hasSize(4))

Для подсчета членов объекта: jsonPath("$.*", hasSize(4))

Мои возвращаемые данные не являются массивом, это LinkedHashMap.class, потому что, если я использую .andExpect(jsonPath("$").isArray()), я получаю:

java.lang.AssertionError: Expected an array at JSON path "$" but found: {id=100, nombre=Jesús Você, apellido=Mão Nuñez, fecha=1977-12-08}
Expected: an instance of java.util.List
     but: <{id=100, nombre=Jesús Você, apellido=Mão Nuñez, fecha=1977-12-08}> is a java.util.LinkedHashMap

Кстати: .andExpect(jsonPath("$.*").isArray()) проход.


person Manuel Jordan    schedule 13.09.2016    source источник
comment
Мне нужно проверить, что ($) равно 1. Подтвердить существование 1 элемента. Я перечитал это несколько раз, но все еще не могу понять. Что здесь означает 1?   -  person Lyubomyr Shaydariv    schedule 05.10.2016
comment
Следующий Body = { "id" : "100", "nombre" : "Jesús Você", "apellido" : "Mão Nuñez", "fecha" : "1977-12-08" } — это всего лишь один элемент с четырьмя полями. Поэтому $.* представляет элемент с четырьмя полями. Но мне нужно проверить предмет (я думал, что $ должно быть достаточно, но не получается).   -  person Manuel Jordan    schedule 05.10.2016
comment
Хм, а что не так с jsonPath("$").exists() тогда?   -  person Lyubomyr Shaydariv    schedule 05.10.2016
comment
Действительно, просто любопытно, если можно по-другому. Что произойдет, если результат вернет два элемента. jsonPath("$").exists() тоже должен пройти, но неважно, было ли это 1 или 2 элемента.   -  person Manuel Jordan    schedule 05.10.2016
comment
Но как получить одновременно более двух элементов JSON в качестве корня? Это должно завершиться ошибкой из-за синтаксической ошибки или по какой-либо другой причине, но в любом случае это должно быть незаконным.   -  person Lyubomyr Shaydariv    schedule 05.10.2016
comment
Да, должен потерпеть неудачу, потому что это не массив (у меня есть только один элемент). Помните To test size of array: jsonPath("$", hasSize(4)) проход, когда это массив с большим количеством элементов, в данном случае 4.   -  person Manuel Jordan    schedule 05.10.2016
comment
Это должно быть специфика сопоставителя hasSize(), который, кажется, принимает как корневые массивы, так и выражение элементов корневого массива. Вы можете написать свой сопоставитель, чтобы заменить hasSize(). Извините, я все еще слеп, чтобы увидеть обоснование вашего запроса. :)   -  person Lyubomyr Shaydariv    schedule 05.10.2016
comment
В том то и дело accept both root arrays or root array для последнего или root array для hasSize() не работает.   -  person Manuel Jordan    schedule 05.10.2016