Skip to content

测试 (Testing)

测试 STOMP 应用程序主要有两种方法:服务器端控制器测试和端到端全链路测试。

服务器端测试

由于控制器的逻辑高度依赖于注解(如 @MessageMapping),纯单元测试(Unit Test)往往无法验证实际运行效果。推荐使用以下方式:

  1. Context-based(基于上下文): 使用 Spring TestContext 框架加载真实的配置,注入 clientInboundChannel,并手动向其发送消息以触发控制器方法。
  2. Standalone(独立模式): 手动设置调用 Controller 所需的最小基础设施(即 SimpAnnotationMethodMessageHandler),直接将消息传递给它。

端到端全链路测试 (Integration Testing)

这是最完整的测试方式。你需要:

  1. 启动一个嵌入式的 WebSocket 服务器(如内置 Tomcat)。
  2. 编写一个真正的 STOMP 客户端进行连接。
  3. 通过客户端发送消息并验证服务器的响应或广播。

示例代码库

Spring 官方提供了一个股票投资组合案例,其中演示了上述所有测试方法的完整实现。


补充教学

1. 模拟用户身份

在测试中,你可以通过在 Message 标头中设置 SimpMessageHeaderAccessor.USER_HEADER 来模拟不同的 Principal,这对于测试针对特定用户的推送逻辑(@SendToUser)非常关键。

2. 等待异步结果

WebSocket 是异步的。在编写端到端测试时,不要使用固定的 Thread.sleep。建议使用像 Awaitility 这样的工具来轮询状态是否达到预期。

3. Java STOMP 客户端的优势

在全链路测试中,建议直接使用 Spring 提供的 WebSocketStompClient。它支持 Java 语法,可以轻松地对接收到的 Payload 进行断言验证。

Based on Spring Framework.