SpringBoot使用WebSocket后启动单元测试报错

>> 饿了么、美团外卖红包领取地址<<

在SpringBoot项目中,增加WebSocket功能之后(SpringBoot使用WebSocket实现前后端消息推送)执行单元测试,发现会报错。

java.lang.IllegalStateException: Failed to load ApplicationContext

查看异常栈信息

Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'serverEndpointExporter' defined in class path resource [com/lqc/app/config/WebSocketConfig.class]: 
Invocation of init method failed; nested exception is java.lang.IllegalStateException: 
javax.websocket.server.ServerContainer not available

大意是,在创建WebSocket的ServerEndpointExporter这个bean的时候创建失败,原因是找不到javax.websocket.server.ServerContainer这个接口的实现类,但是我们正常启动项目都能启动起来,为啥会没有这个类呢?

查看@SpringBootTest注解的内容,我们发现默认的WebEnvironment是MOCK类型,而MOCK的embedded值为false。也就是说,默认的单元测试是不真正启动web容器(嵌入的tomcat),而ServerEndpointExporter这个bean依赖的javax.websocket.server.ServerContainer这个接口的实现类org.apache.tomcat.websocket.server.WsServerContainer恰好就在web容器中。

因此默认的MOCK类型由于不启动web容器继而导致ServerEndpointExporter创建失败进而导致单元测试报错。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(SpringBootTestContextBootstrapper.class)
@ExtendWith({SpringExtension.class})
public @interface SpringBootTest {
    @AliasFor("properties")
    String[] value() default {};
    @AliasFor("value")
    String[] properties() default {};
    String[] args() default {};
    Class<?>[] classes() default {};
    SpringBootTest.WebEnvironment webEnvironment() default SpringBootTest.WebEnvironment.MOCK;
    public static enum WebEnvironment {
        MOCK(false),
        RANDOM_PORT(true),
        DEFINED_PORT(true),
        NONE(false);
        private final boolean embedded;
        private WebEnvironment(boolean embedded) {
            this.embedded = embedded;
        }
        public boolean isEmbedded() {
            return this.embedded;
        }
    }
}

问题原因找到了,解决问题的办法也很简单,我们手动指定一下WebEnvironment即可。在@SpringBootTest上增加一个参数,代码如下:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

单元测试即可正常运行。


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍

维特丝(vetes)泡沫发蜡喷雾干胶定型弹力素羊毛卷男女保湿蓬松发胶 泡沫发蜡450ml+旅行装99ml
¥34.00
维特丝(vetes)一梳黑染发剂染发梳植物潮色显白遮盖白发自然清水纯黑发焗油男女梳炫彩 自然黑LW00
¥49.00
维特丝(vetes)染发笔遮白补染快速染发天然植物一次性染发棒 一次性染发棒黑色
¥46.00
维特丝 护发精油防毛躁清香玫瑰奇焕亮发干枯烫发卷发直发头发润发护发素男女士 滋养柔顺护发精油100ml
¥36.00