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)
| 归档时间: |
|
| 查看次数: |
1876 次 |
| 最近记录: |