Spring中用于websockets测试的MockHttpServletRequestBuilder的等价物是啥

Posted

技术标签:

【中文标题】Spring中用于websockets测试的MockHttpServletRequestBuilder的等价物是啥【英文标题】:What is the equivalent of MockHttpServletRequestBuilder for websockets tests in SpringSpring中用于websockets测试的MockHttpServletRequestBuilder的等价物是什么 【发布时间】:2017-11-23 02:06:47 【问题描述】:

什么是 websocket 的 MockHttpServletRequestBuilder 等价物。即在我想测试 Websockets 的情况下,我想测试一个长时间运行的 websocket 应用程序并避免 SecurityContextPersistenceFilter 在应该进行升级的第一个 http get 调用之后覆盖 SecurityContex 的情况。对于普通的 rest http 应用程序,到目前为止,这是通过利用 SecurityMockMvcRequestPostProcessors 完成的。 这里的例子using the SecurityMockMvcRequestPostProcessors

但是当我想测试一个长时间运行的 websocket 应用程序时该怎么办。即我想为 websockets 创建类似 MockHttpServletRequestBuilder 的东西。春天有这样的东西吗?或者有没有办法为此目的使用 MockHttpServletRequestBuilder ? IE。目标是创建websocket端点,避免升级后SecurityContex被清空的情况。

我找到了一些替代方法,例如按照here 的描述传递会话,但这对我来说并不是真正的替代方法,因为使用方法级别安全性的代码不起作用,因为 SecurityContex 正在被更改。

【问题讨论】:

【参考方案1】:

看来这可以通过提供测试袜子配置来完成。例

    @EnableWebSocketMessageBroker
    static class TestWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer 

        @Autowired
        Environment env;

        @Override
        public void registerStompEndpoints(StompEndpointRegistry registry) 
            registry.addEndpoint("/portfolio").withSockJS();
        

        @Override
        public void configureMessageBroker(MessageBrokerRegistry registry) 
//          registry.enableSimpleBroker("/queue/", "/topic/");
            registry.enableStompBrokerRelay("/queue/", "/topic/");
            registry.setApplicationDestinationPrefixes("/app");
        
    

完整的课程可以在这里找到: https://github.com/rstoyanchev/spring-websocket-portfolio/blob/master/src/test/java/org/springframework/samples/portfolio/web/context/ContextPortfolioControllerTests.java

这里还有一些 Spring 提供的额外示例,演示了测试 Web 套接字的 3 种不同方法: https://github.com/rstoyanchev/spring-websocket-portfolio/tree/master/src/test/java/org/springframework/samples/portfolio/web

【讨论】:

以上是关于Spring中用于websockets测试的MockHttpServletRequestBuilder的等价物是啥的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + WebSocket 实时消息推送

测试时如何从 MockWebServer 中提取参数?

在 Spring Boot 测试中的纯二进制 websocket 连接期间保持 TestSecurityContextHolder

阻塞消息挂起 10000 用于阻塞 ..使用 spring websockets

Spring Boot Websocket 在 SockJS 客户端测试中抛出“连接被拒绝”

来自 UI 的 Websocket 连接到 Spring Boot 应用程序的实例之一,用于流式传输队列中的数据