当你使用 Spring 的 STOMP-over-WebSocket 支持时,有两种主要方法来测试应用程序。第一种是编写服务器端测试,以验证控制器的功能和它们注释的消息处理方法。第二种是编写完整的端到端测试,包括运行一个客户端和一个服务器。
这两种方法并不相互排斥。相反,在整个测试策略中,每一种都有其位置。服务器端的测试更有针对性,更容易编写和维护。另一方面,端到端的集成测试更完整,测试的内容更多,但它们也更需要编写和维护。
服务器端测试的最简单形式是编写控制器单元测试。然而,这还不够有用,因为控制器的大部分工作都取决于它的注解。纯粹的单元测试根本无法测试这些。
理想情况下,被测试的控制器应该在运行时被调用,就像使用 Spring MVC 测试框架来测试处理 HTTP 请求的控制器的方法一样—也就是说,不运行 Servlet 容器,而是依靠 Spring 框架来调用注解的控制器。与 Spring MVC 测试一样,你在这里有两种可能的选择,要么使用 「基于上下文」,要么使用 「独立」设置:
- 在 Spring TestContext 框架的帮助下加载实际的 Spring 配置,注入 clientInboundChannel 作为测试字段,并使用它来发送控制器方法要处理的消息。
- 手动设置调用控制器所需的最小 Spring 框架基础设施(即 SimpAnnotationMethodMessageHandler),并将控制器的消息直接传递给它。
这两种设置情况都在 股票组合样本程序 的测试中得到了证明。
第二种方法是创建端到端的集成测试。为此,你需要在嵌入式模式下运行 WebSocket 服务器,并作为 WebSocket 客户端连接到它,发送包含 STOMP 框架的 WebSocket 消息。股票投资组合样本应用程序 的测试也展示了这种方法,它使用 Tomcat 作为嵌入式 WebSocket 服务器和一个简单的 STOMP 客户端进行测试。