Spring WebFlux Reactive WebSocket测试

wfauudbj  于 2023-04-30  发布在  Spring
关注(0)|答案(1)|浏览(131)

我正在尝试为Webflux Reactive WebSocket编写一个测试,当Assert失败时,测试正常,但当它应该通过测试时,测试继续运行,什么也没有发生。
下面是简化版的测试。

webSocketClient.execute(getUrl("/websocket"),
    session -> {
      return session.receive().map(WebSocketMessage::getPayloadAsText)
          .doOnNext(it->assertEquals("test", it)).then();
    }
).block(Duration.ofSeconds(2));

尝试将Assert放置在不同的位置,如。map,.doOnNext(),.handle(),但没有任何变化。
如果有人能帮忙,我将不胜感激。谢谢

vxbzzdmp

vxbzzdmp1#

我发现的唯一一个解决方案来自spring framework本身:

void testEcho() {
        int count = 100;
        Flux<String> input = Flux.range(1, count).map(index -> "msg-" + index);
        // 1. Declare variable outside of the handler's body
        AtomicReference<List<String>> actualRef = new AtomicReference<>(); 
        
        // 2. Make a websocket query
        this.client.execute(getUrl("/echo"), session ->
                session.send(input.map(session::textMessage))
                        .thenMany(session.receive().take(count).map(WebSocketMessage::getPayloadAsText))
                        .collectList()
                        // 3. Assign response to outer variable
                        .doOnNext(actualRef::set)
                        .then())
                .block(TIMEOUT); // be sure to really perform a query with block
        
        // 4. Make assertions on outer variable
        assertThat(actualRef.get()).isNotNull();
        assertThat(actualRef.get()).isEqualTo(input.collectList().block());
    }

简而言之:
1.您应该在会话处理程序之外创建一个变量(第83行)
1.技巧是将响应结果存储在外部变量中(第88行)
1.然后使用block()执行完整的WebSocket查询(第84行)
1.现在,您可以在会话的作用域之外对该变量进行Assert(第91、92行)
P.s.我不是StackOverlow回答专业人士,所以欢迎任何格式帮助/建议!

相关问题