当控制器返回 EmitterProcessor 而不是 Flux 时,WebTestClient 在单元测试中阻塞

Gee*_*aat 7 spring unit-testing reactive spring-webflux

我正在开发一个使用 Spring WebFlux 堆栈的项目。我们有一个控制器,您可以在其中订阅特定对象的更新。此控制器返回EmitterProcessor客户端可以订阅的位置。当某些内容在 上发布时EmitterProcessor,订阅的客户端会收到通知。

这在实践中效果很好,但我的单元测试失败了。单元测试使用WebTestClient,它在exchange()操作返回 a时阻塞EmitterProcessor(也尝试了其他FluxProcessor实现,例如UnicastProcessor)。我得到的错误如下:

java.lang.IllegalStateException:5000 毫秒的阻塞读取超时

at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:117)
at reactor.core.publisher.Mono.block(Mono.java:1524)
at org.springframework.test.web.reactive.server.DefaultWebTestClient$DefaultRequestBodyUriSpec.exchange(DefaultWebTestClient.java:283)
Run Code Online (Sandbox Code Playgroud)

我找到了这个线程,它也报告exchange()WebTestClient块上的方法,但正如那里所解释的那样,它只是为了检索状态和标题而阻塞,所以这应该不是问题。此外,在Flux返回a 的情况下,这可以正常工作,如引用的testcase 所示

测试用例

我创建了一个从引用的测试用例派生的简单测试用例,并将其调整为Flux在一种情况下返回 a ,EmitterProcessor在另一种情况下返回an (失败)。您可能会注意到, 的断言EmitterProcessor应该失败,但由于阻塞exchange()调用,它永远不会到达那里。

另请注意,当我取消注释该行时processor.onNext("hello");,将返回此内容并且测试用例成功。

at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:117)
at reactor.core.publisher.Mono.block(Mono.java:1524)
at org.springframework.test.web.reactive.server.DefaultWebTestClient$DefaultRequestBodyUriSpec.exchange(DefaultWebTestClient.java:283)
Run Code Online (Sandbox Code Playgroud)

Che*_*Liu 0

就我而言,是Content-Length响应中的标头值错误导致了WebTestClient阻塞。