测试 (Testing)
测试 STOMP 应用程序主要有两种方法:服务器端控制器测试和端到端全链路测试。
服务器端测试
由于控制器的逻辑高度依赖于注解(如 @MessageMapping),纯单元测试(Unit Test)往往无法验证实际运行效果。推荐使用以下方式:
- Context-based(基于上下文): 使用 Spring TestContext 框架加载真实的配置,注入
clientInboundChannel,并手动向其发送消息以触发控制器方法。 - Standalone(独立模式): 手动设置调用 Controller 所需的最小基础设施(即
SimpAnnotationMethodMessageHandler),直接将消息传递给它。
端到端全链路测试 (Integration Testing)
这是最完整的测试方式。你需要:
- 启动一个嵌入式的 WebSocket 服务器(如内置 Tomcat)。
- 编写一个真正的 STOMP 客户端进行连接。
- 通过客户端发送消息并验证服务器的响应或广播。
示例代码库
Spring 官方提供了一个股票投资组合案例,其中演示了上述所有测试方法的完整实现。
补充教学
1. 模拟用户身份
在测试中,你可以通过在 Message 标头中设置 SimpMessageHeaderAccessor.USER_HEADER 来模拟不同的 Principal,这对于测试针对特定用户的推送逻辑(@SendToUser)非常关键。
2. 等待异步结果
WebSocket 是异步的。在编写端到端测试时,不要使用固定的 Thread.sleep。建议使用像 Awaitility 这样的工具来轮询状态是否达到预期。
3. Java STOMP 客户端的优势
在全链路测试中,建议直接使用 Spring 提供的 WebSocketStompClient。它支持 Java 语法,可以轻松地对接收到的 Payload 进行断言验证。