You need to enable JavaScript to run this app. 如何为Spring TextWebSocketHandler编写连接及消息发送集成测试?
优惠活动
大模型
产品
解决方案
定价
更多

如何为Spring TextWebSocketHandler编写连接及消息发送集成测试?

Spring WebSocket 集成测试实现方案

前置依赖

确保项目测试环境已引入WebSocket和Spring Boot测试依赖,Maven配置示例如下:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

集成测试代码

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.client.standard.StandardWebSocketClient;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class WebSocketIntegrationTest {

    @LocalServerPort
    private Integer port;

    private final CountDownLatch messageLatch = new CountDownLatch(1);
    private String receivedPayload;

    @Test
    public void verifyWebSocketConnectAndMessageSend() throws Exception {
        StandardWebSocketClient webSocketClient = new StandardWebSocketClient();
        
        // 发起WebSocket连接请求
        WebSocketSession session = webSocketClient.doHandshake(new TextWebSocketHandler() {
            @Override
            protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
                receivedPayload = message.getPayload();
                messageLatch.countDown();
                session.close();
            }
        }, "ws://localhost:" + port + "/data").get(3, TimeUnit.SECONDS);

        // 验证连接成功建立
        assertTrue(session.isOpen());
        // 验证3秒内收到服务端推送消息
        assertTrue(messageLatch.await(3, TimeUnit.SECONDS), "未接收到服务端推送的消息");
        // 验证消息内容与Message.sendMessage()返回值匹配
        assertEquals("text", receivedPayload);
    }
}

测试逻辑说明

  • 测试启动时会启动完整的Spring Boot Web服务,使用随机端口避免端口冲突
  • 初始化标准WebSocket客户端向/data端点发起连接,验证连接是否可以正常建立
  • 客户端接收到服务端推送的第一条消息后,校验内容是否符合预期,校验完成自动关闭连接

现有代码优化建议

你当前SocketHandler的afterConnectionEstablished方法中使用了死循环直接推送消息,会占用WebSocket核心处理线程,导致后续连接无法正常接入,建议将循环推送逻辑提交到独立的线程池执行,避免阻塞核心线程。

内容的提问来源于stack exchange,提问作者jjakubos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 06:15:03