#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 был гигантским одноэлементным списком. Можете ли вы удалить внешние скобки?