我想测试我的 WebSocket 应用程序。
测试类:
@RunWith(SpringRunner.class)
@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ContextConfiguration(
classes = {WebConfig.class, WebSocketConfig.class}
@DirtiesContext
public class IntegrationTest {
@Autowired
public EmbeddedWebApplicationContext server;
@Test
...
}
WebConfig 类:
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
public final WebSocketService webSocketService;
@Autowired
public WebConfig(WebSocketService webSocketService) {
this.webSocketService = webSocketService;
}
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.setPort(1234);
tomcat.setContextPath("/test");
return tomcat;
}
}
和 WebSocketConfig 类:
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Autowired
public WebSocketConfig() {}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
webSocketHandlerRegistry.addHandler(webSocketHandler(), "ws")
.setAllowedOrigins("*")
}
@Bean
public WebSocketHandler webSocketHandler() {
return new WebsocketHandler(webSocketService());
}
@Bean
publicWebSocketService webSocketService() {
return newWebSocketServiceImpl();
}
}
当我开始测试时,Tomcat 正在启动并正在侦听指定的 Port 1234
。但我无法连接 websocket 客户端。调用 WebSocketConfig。但我认为 websocket 映射不起作用。我忘了配置什么吗?
当我WebSocketApp.class
使用带有注释的应用程序类 ( )开始测试时@SpringBootApplication
,websocket 映射工作正常。
@RunWith(SpringRunner.class)
@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ContextConfiguration(
classes = {WebSocketApp.class}
@DirtiesContext
public class IntegrationTest {
@Autowired
public EmbeddedWebApplicationContext server;
@Test
...
}
WebSocketApp 也使用相同的配置。
我认为第二种方法有效,因为@EnableWebSocket
使用了。当我不使用 WebSocketApp.class (用 注释@SpringBootApplication
)时,@EnableWebSocket
将被忽略。
有人有想法让测试运行吗?如何在没有注释的情况下手动启用 websocket?
编辑:
我发现,那里TomcatEmbeddedContext
使用的是默认 servlet 映射而不是dispatcherServlet
映射。是否可以设置这种类型的映射?