背景
近日,假码农参与到一个新的项目中,该项目使用的是Springboot框架,并集成了WebSocket技术到项目中。
事件经过
假码农最近参与到一个新的项目中,在熟悉了一天项目之后,写了一点新功能,项目在本地是可以正常启动的,但是在进行单元测试的时候,就遇到问题了,具体错误信息如下:
从错误的信息,我们可以看出,错误信息提示在 ServletContext 中 没用发现 javax.websocket.server.ServerContainer 属性。我的第一反应就是项目的环境问题,但是,项目又可以正常启动,所以让我感到很迷惑。再加上办公环境全部是内网开发,这就让我很被动。
在我无数次的乱捣鼓后,我偶然点开了@SpringBootTest 这个注解的源码,在里面发现了一个属性webEnvironment,我感觉我好像发现了新大陆了。
从其源码中,我们可以看到webEnvironment这个属性的默认值是SpringBootTest.WebEnvironment.MOCK,并且其值还有其他几个选项,于是,我将单元测试类上@SpringBootTest的注解里面加上了webEnvironment 属性,并将其值指定为SpringBootTest.WebEnvironment..RANDOM_PORT。于是,世界一下子都清净了。
后记
原来SpringBootTest单元测试,默认情况下并不会去真正启动一个web 服务,而是mock了一个服务。这也就导致产生了上面的错误。从 SpringBootTest.WebEnvironment.MOCK的源码中可以看出其embedded 属性值为false,并不会真正嵌入一个web容器的。好了,本次分享就到这里了,感兴趣的小伙伴可以自己去深入研究其原理。