使用spring反应应用程序,我创建了一个每秒产生一个事件的休息服务。我的休息控制器的代码是:
@GetMapping(value = "/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<Event> getEvents() {
Flux<Event> eventFlux = Flux.fromStream(Stream.generate(() -> new Event(new Random().nextLong(), "Hello Event")));
Flux<Long> emmitFlux = Flux.interval(Duration.ofSeconds(1));
return Flux.zip(eventFlux, emmitFlux).map(Tuple2::getT1);
}
单元测试的方法如下:
webTestClient.get()
.uri("/events")
.accept(MediaType.TEXT_EVENT_STREAM)
.exchange()
.expectStatus()
.isOk();
FluxExchangeResult<Event> result = webTestClient.get().uri("/events").accept(MediaType.TEXT_EVENT_STREAM)
.exchange()
.expectStatus()
.isOk()
.returnResult(Event.class);
Flux<Event> eventFlux = result.getResponseBody();
StepVerifier.create(eventFlux)
.expectSubscription()
.thenAwait(Duration.ofSeconds(1))
.expectNextCount(0)
.thenAwait(Duration.ofSeconds(1))
.expectNextCount(1)
.thenAwait(Duration.ofSeconds(1))
.expectNextCount(2);
但是当我运行测试时,我收到了这个错误:
java.io.IOException: Connection closed prematurely
有没有人面对并解决任何与弹簧反应相似的问题?
答案 0 :(得分:0)
您必须始终使用src
结束StepVerifier
链,否则它不会订阅它,也不会发生任何事情。
在这种情况下,因为它是一个无限的流,所以在验证之前你还必须有一个.verify();
,否则你的测试可以无限期地运行。