当前位置: 首页 > 知识库问答 >
问题:

在Spring引导应用程序中测试webSocket

茅昀
2023-03-14

我不明白在springboot应用程序中如何正确地编写websocket测试用例。我有一个实现WebSocketHandler的类,我在WebSocketConfigurer中添加了这个处理程序:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(logWebSocketHandler() , "/test")
            .addInterceptors(new HttpSessionHandshakeInterceptor())
            .setAllowedOrigins("*");
}

@Bean
public LogWebSocketHandler logWebSocketHandler(){
    return new LogWebSocketHandler();
}
}

但是当我写下下面的测试用例时,我得到了一个例外:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration({App.class})
@WebAppConfiguration
public class LogsControllerTest  {

private WebSocketContainer container;

@Before
public void setup() {
    container = ContainerProvider.getWebSocketContainer();

}

@Test
public void testGetLog() throws Exception {
    Session session = container.connectToServer(new TestEndpoint(),
            URI.create("ws://127.0.0.1:8080/test"));
}
}

异常:javax.websocket.部署异常:发起WebSocket连接的HTTP请求失败

如果我将ws://127.0设置为。0.1:8080/test/(结尾斜杠)它可以工作,但不工作。

我做错了什么?

共有1个答案

张翰海
2023-03-14

我找到了解决方案:

添加注释@WebIntegrationTest(value=8080)或者您可以指定randomPort=true

在此之后加上:

@ClientEndpoint
public class TestWebSocketClient {
    Session session;

    @OnOpen
    public void onOpen(final Session session){
        this.session = session;
    }
}

测试的主体:

@Autowired
private LogWebSocketHandler socketHandler;

private WebSocketContainer container;
private TestWebSocketClient client;

@Before
public void setup() {
    container = ContainerProvider.getWebSocketContainer();
    client = new TestWebSocketClient();
}

@Test
public void createSessionAfterOpenLogWebSocketHandler() throws Exception {
    container.connectToServer(client , URI.create("ws://localhost:8080/path"));
    while( !socketHandler.isOpen()){
        // sometime it is doesn't work, but I dont know solution of this problem
        // wait until socket is open
    }
    Assert.assertTrue( socketHandler.isOpen() );
}
 类似资料:
  • 我有一个Spring Boot应用程序依赖于谷歌PubSub。我想用谷歌云PubSub模拟器运行它。如何解析,以便应用程序启动并使用来自本地模拟器而不是外部项目的消息? 目前,如果我将GOOGLE_APPLICATION_CREDENTIALS设置为dev.json,则不会调用PubSub,如果我不设置变量,则测试崩溃。我怎样才能克服它?我不会拼图。 注意:我正在编写一个完整的Spring boo

  • 有一个Spring应用程序“A”打包为JAR(带有maven),应用程序“A”的POM文件包含一些定义的特定maven依赖项。 在另一个打包为JAR的spring boot应用程序“B”中,添加了应用程序“A”的依赖项,但在执行“B”时,它对应用程序“A”中提到的依赖项抛出了几个ClassNotFound/NoClassDef错误。 注意-应用程序“A”不是一个引导项目。这是一个简单的用maven

  • 我知道Spring Boot应用程序可以作为war文件部署到生产环境中。但是部署spring boot应用程序的典型方式是什么?它只需要jvm而不需要容器吗?

  • 我有一个简单的Spring Boot Application结构,如下所示 pplication.java注释为 SpringConfig。java用@Configuration注释,并有一个返回DBService新实例的方法。该方法用@Bean注释 DBService类中包含了自动加载的存储库。这些存储库来自另一个项目依赖项,并提供到RDBMS/数据存储的连接。 我在applicationCon

  • 以下是我的场景。 我有我的应用程序,它构建在带有嵌入式tomcat服务器的Spring Boot上。在我的应用程序中,我有单元测试和集成测试。 首先,我想将我的应用程序构建为一个maven包(jar ),它将覆盖所有的单元测试,然后下一步是将jar文件作为spring boot application运行((java -jar myapplication.jar ),它将启动tomcat服务器。最

  • 设置是,我希望有一个正在运行的应用程序,然后使用@Value注释中的URL运行集成测试。我的测试类使用Rest Assured并如下所示: 我的build.gradle文件如下所示: