Spring Reactive:java.io.IOException:当尝试对返回通量的服务进行单元测试时,连接过早关闭

时间:2018-04-22 16:05:12

标签: java spring reactive-programming spring-webflux

使用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

有没有人面对并解决任何与弹簧反应相似的问题?

1 个答案:

答案 0 :(得分:0)

您必须始终使用src结束StepVerifier链,否则它不会订阅它,也不会发生任何事情。

在这种情况下,因为它是一个无限的流,所以在验证之前你还必须有一个.verify();,否则你的测试可以无限期地运行。