DSL WebTestClient не может получить коллекцию при использовании пути JSON

#java #spring-boot #spring-webflux #java-11 #jsonpath

#java #spring-boot #spring-webflux #java-11 #jsonpath

Вопрос:

У меня есть приложение Spring Boot 2.3.2.RELEASE WebFlux. Я создаю тест для контроллера, использующего @WebFluxTest и внедряющего WebTestClient экземпляр. Все работает нормально, но (это глупо) Кажется, я не могу найти способ получить для данного элемента / ключа JSON его соответствующее значение (набор элементов) из ответа с использованием JSONPath.

Это тест:

 @Test
void getById_Spec() { // HTTP 200 (OK)
  final var expected = Entity.reconFoobling();
  Mockito.when(service.findById(ArgumentMatchers.any(GetItemsCommand.class)))
      .thenReturn(Flux.just(expected));
  webClient.get()
      .uri(URI_FROM.apply(expected.getId()))
      .accept(MediaType.APPLICATION_JSON)
      .exchange()
      .expectStatus().isOk()
      .expectHeader().contentType(MediaType.APPLICATION_JSON)
      .expectBody()
      .jsonPath("$.length()").isEqualTo(1)
      .jsonPath("$[0].code").isEqualTo("1001")
      ...
      .jsonPath("$[0].alarms.length()").isEqualTo(2)
      .jsonPath("$[0].alarms[0].lanes.length()").isEqualTo(1)
      // .jsonPath("$[0].alarms[0].lanes").isEqualTo(List.of("PRIMARY"))
      // .jsonPath("$[0].alarms[0].lanes.").isEqualTo(List.of("PRIMARY"))
      // .jsonPath("$[0].alarms[0].lanes.*").isEqualTo(List.of("PRIMARY"))
      // .jsonPath("$[0].alarms[0].lanes[*]").isEqualTo(List.of("PRIMARY"))
      ...
      .jsonPath("$[0]._id").isEqualTo(1_100L);
  Mockito.verifyNoInteractions(gateway, store);
}
  

Независимо от того, какое выражение я использую для получения $[0].alarms[0].lanes (которое я сначала тестирую здесь: https://jsonpath.com /), это просто не работает, я всегда получаю:

 java.lang.AssertionError: JSON path "$[0].alarms[0].lanes" expected:<[PRIMARY]> but was:<null>
Expected :[PRIMARY]
Actual   :null
  

… и я знаю, что JSON, который я получаю, является правильным:

 > GET /path/to/1234567890/resources
> WebTestClient-Request-Id: [3]
> Accept: [application/json]

No content

< 200 OK OK
< Content-Type: [application/json]

[{"code":"1001","alarms":[{"lanes":["PRIMARY"]},{"lanes":["SECONDARY"]}],"categories":[],"createdOn":1602268418140,"_id":1100}]
  

Комментарии:

1. Похоже, что ваш входной JSON неверен; или отсутствует } просто опечатка? ["SECONDARY"]}]

2. Это / была опечатка; Я стараюсь не делиться многими деталями, потому что это с работы (а они «особые» люди), Поэтому я редактирую данные поля и т. Д.; Но это определенно действительный JSON, вы можете отменить это 😉

3. Не очень хорошо, чтобы ваш JSON был гигантским одноэлементным списком. Можете ли вы удалить внешние скобки?