WebTestClient: необходимо ли использовать тело ответа? (Соединение преждевременно закрыто ПЕРЕД ответом) - PullRequest
0 голосов
/ 27 марта 2020

Учитывая некоторый код, который выполняет вызов 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, и если да, то документировано ли это где-нибудь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...