【发布时间】:2019-09-08 05:46:55
【问题描述】:
我正在努力解决 集成测试 和 普通 REST 调用之间的行为不一致。
让我解释一下:当我从其他客户端(例如 Postman)执行 POST 时,我的生产代码中有一个错误导致:NoSuchElementException: Source was empty 异常。
我试图重用已订阅的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("john@example.com")
.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
)
当来自 Postman/curl 的 POST 调用失败时,我不确定为什么我的测试通过了。有人可以建议吗?区别在哪里?
【问题讨论】:
标签: spring-boot spring-webflux spring-test project-reactor