#spring #spring-webflux #spring-test
#spring #spring-webflux #spring-test
Вопрос:
Я пишу несколько тестов для приложения Spring WebFlux и пытаюсь смоделировать сценарий, в котором запрос не имеет тела. Я потянулся к встроенному MockServerRequest
, полагая, что буду использовать встроенный макет вместо создания собственного. Это действительно позволяет создавать экземпляр без тела, но мои тесты терпят неудачу, поскольку все его методы извлечения тела содержат утверждение, что тело не равно null. Похоже, это не соответствует тому, как будет вести себя реальный запрос. Вполне возможно отправить запрос без тела. Я бы также сказал, что разумно иметь код, который проверяет, есть ли тело, что подтверждается существованием таких методов, как awaitBodyOrNull
(я использую Kotlin).
Я что-то здесь упускаю / недопонимаю? Я создаю свой макет, просто выполняя MockServerRequest.builder().build()
(тестируемые методы не заботятся ни о чем, кроме тела). Возможно, этот класс на самом деле не предназначен для использования сам по себе? Я не нахожу, чтобы кто-нибудь еще спрашивал об этом, поэтому я чувствую, что, должно быть, что-то упускаю из виду.
Сейчас я обойду это, просто создав свой собственный макет.
Комментарии:
1. Я не слишком внимательно читал, что происходит, но Flux / Reactor не все обнуляет в потоке. Вам нужно будет отправить Mono.empty(). Итак, что бы вы ни издевались, никогда не должно возвращать null в теле, и фактически это не удастся, потому что поток будет прерываться при любой попытке.
2. Я отредактировал заголовок, чтобы он был немного понятнее. Я не пытаюсь передать null в макет builder, я просто пытаюсь имитировать запрос, для которого тело не было отправлено. Возврат
Mono.empty()
(который затем будет переведен вnull
для Kotlin) — это поведение, которого я ожидал бы. Вместо этогоmockRequest.awaitBodyOrNull<TestDto>()
выдаетIllegalStateException
, а не возвращает null.3. О, подождите, вот оно. При более внимательном рассмотрении исходного кода ожидается, что тело, которое вы ему предоставляете, уже будет обернуто в
Mono
. Я предположил, что из параметра, являющегося typeObject
, он обернет тело (или его отсутствие) для меня. Если вы хотите отформатировать это как ответ, я отдам вам должное. В противном случае я просто закрою вопрос сам.4. Нет, не беспокойтесь, рад, что вы с этим разобрались.
5. Тогда все в порядке. Спасибо за мысленный толчок. 🙂
Ответ №1:
MockServerRequest.Builder
ожидает, что вы предоставите ему тело, уже завернутое в Mono
. Это не выполняет никакого переноса для вас. Таким образом, имитация пустого запроса выполняется с помощью MockServerRequest.builder().body(Mono.empty<TestDto>())
.