Я борюсь с поведением несоответствия между интеграционным тестом и простым вызовом REST.
Позвольте мне объяснить: у меня была ошибка в моем производственном коде, вызывающая исключение: NoSuchElementException: Source was empty
, когда я выполняю POST
из клиента отдыха (например, Postman).
Я пытался повторно использовать Mono
, на который уже подписан. См. ниже:
public Mono<ServerResponse> createUser(ServerRequest serverRequest) {
Mono<User> userMono = serverRequest.bodyToMono(User.class);//Can only be subscribed to once!!
return validateUser(userMono)
.switchIfEmpty(validateEmailNotExists(userMono))
.switchIfEmpty(saveUser(userMono))
.single();
}
Однако следующий интеграционный тест ни разу не смог воспроизвести производственную ошибку !!
Это тест с зеленой полосой:
@Test
void shouldSignUpUser() {
WebTestClient client = WebTestClient
.bindToRouterFunction(config.route(userHandler))
.build();
User user = User.builder()
.firstName("John")
.lastName("Smith")
.email("[email protected]")
.build();
client
.post()
.uri("/api/user")
.body(Mono.just(user), User.class)
.exchange()
.expectStatus()
.is2xxSuccessful()
.expectBody()
.jsonPath("$.id")
.isNotEmpty()
.jsonPath("$.firstName")
.isEqualTo("John");
}
Даже если я укажу полную веб-среду следующим образом:
@SpringBootTest(
properties = "spring.main.web-application-type=reactive",
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
Я не уверен, почему мой тест проходит, когда не удается выполнить вызов POST от Postman / curl. Может кто-нибудь посоветовать? В чем разница?