springboot集成websocket后,单元测试报错

239 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

本文系作者 不太自律的程序猿原创,转载请私信并在文章开头附带作者和原文地址链接。

前言

今天本来是打算写几个测试用例,测试一下。结果刚写了一个Hello World输出,启动就报错了,我人傻掉了,之前也没遇到过咋回事,于是我就去百度了百度。

image.png

关键报错信息

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serverEndpointExporter' defined in class path resource [com/itarge/smarttraffic/common/config/WebSocketConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
	at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$473/1396385390.getObject(Unknown Source)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:338)
	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:123)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
	... 84 more

首先我们来看一下报错信息,我们直接看报错信息,直接看我们看得懂的,提示我们说在创建对象名为serverEndpointExporter的时候失败了,我们点击serverEndpointExporter去看一看是那个类。

点击serverEndpointExporter之后,发现跳转到了WebSocketConfig这个类中了,这是项目引入WebSocket的配置类,于是我就懵了,之前没遇到过啊。 image.png 于是乎,我去百度了百度,发现由于测试环境下,没有websocket环境,所以测试的时候需要注释掉;正常启动的时候取消注释就可以了,也可以把websocket的config写成根据不同配置选择是否加载的,让他判断如果是test环境,也不加载websocket。

不过我发现还有一个更简单的解决方案,只需要在SpringbootTest注解中添加webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT就可以了。

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

我们将webEnvironment的属性添加上之后,我们再来测试一下,发现没有问题了。

image.png

可以继续搞了。开心!!! image.png

感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。