Учитывая некоторый код, который выполняет вызов API, в некоторых тестах довольно часто проверяют только статус ответа, игнорируя тело ответа:
webTestClient
.get().uri("exampe")
.exchange()
.expectStatus().isOk
Однако иногда это приводит к следующей ошибке:
reactor.core.Exceptions$ReactiveException: reactor.netty.http.client.PrematureCloseException: Connection prematurely closed BEFORE response
at reactor.core.Exceptions.propagate(Exceptions.java:366)
at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:137)
at reactor.core.publisher.Mono.block(Mono.java:1688)
at org.springframework.test.web.reactive.server.DefaultWebTestClient$DefaultRequestBodyUriSpec.exchange(DefaultWebTestClient.java:307)
Добавление expectBody()
может решить эту проблему (пока не уверен, потому что ошибка прерывистая), но кажется странным, что WebTestClient
не очищает это автоматически. Легко забыть позвонить на expectBody()
, когда требуется только проверить статус ответа.
DefaultWebTestClient
использует WebClient.RequestHeadersSpec.exchange()
. документы для обмена говорят:
В отличие от retrieve()
, при использовании exchange()
приложение несет ответственность за использование любого содержимого ответа независимо от сценария (успех, ошибка, неожиданные данные и т. д. c). Невыполнение этого требования может привести к утечке памяти. См. ClientResponse
для получения списка всех доступных опций для потребления тела. Обычно предпочитают использовать retrieve()
, если у вас нет веских причин для использования exchange()
, который позволяет проверить состояние ответа и заголовки, прежде чем принимать решение о том, как или если использовать ответ.
Однако WebTestClient
не предоставляет функцию retrieve()
. Так нужно ли всегда использовать тело ответа вручную при использовании WebTestClient
, и если да, то документировано ли это где-нибудь?