小编Gee*_*aat的帖子

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

我正在开发一个使用 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)

spring unit-testing reactive spring-webflux

7
推荐指数
1
解决办法
1876
查看次数

Spring Boot将来会支持Spring Webflux应用程序的WAR部署吗?

我知道与Spring Framework相反,Spring Boot 不支持Spring WebFlux应用程序的WAR部署。我的问题很简单:将来会否出现?

我的用例是这样的:我们仍然有很多客户仍然生活在传统的“我们将所有内容都部署在应用程序服务器X”上。因此,尽管我们希望推出独立的JAR,但尚未准备就绪。我们大量使用Spring Boot,并且确实希望继续使用Spring Boot,因此放弃它不是一种选择。

我们正在构建反应性应用程序,并希望为此使用Spring WebFlux,但是我们仍然需要部署到应用程序服务器,因此这不是一种选择。在此期间,我们避免使用Spring WebFlux,而只使用Controllers,它虽然有效,但并不那么优雅。因此,我的问题。

spring-boot spring-webflux

0
推荐指数
1
解决办法
164
查看次数