先说一说学习方法。很多时候,我们遇到问题了都会先去百度,但是百度出来的文章不一定全对,而且技术,质量参差不齐。这个时候最好的办法是去查看官方文档,当然我们也完全不能保证官方的文档就一定正确。但我们还是应该相信官方文档,然后结合上下文来确定正确的用法。
今天周六,我在带娃,不能兼顾到大家,请互相谅解。平时也有不少网友私信我,问一些技术问题,但我个人的时间和精力都非常的有限。平时多积累知识,遇到问题才能游刃有余!
抽个时间,我来说说标题中的 SpringBootTest.WebEnvironment。
看字面意思就应该猜出个大半,它是 SpringBoot 的测试时,用来指定 web 环境的。
SpringBootTest.WebEnvironment 中一共有 4 个枚举值。
- DEFINED_PORT:创建一个(reactive) web 应用程序上下文,使用默认端口。针对这个属性,网上翻译的解读比较多,错误的也多。
- MOCK:MOCK 是用的比较多的一个属性。它会判断,当你使用 servlet API 时,则使用模拟 servlet 环境创建 WebApplicationContext;如果是使用 WebFlux,则使用 ReactiveWebApplicationContext;否则,使用常规的 ApplicationContext。
- NONE:这个也有很多人理解错误,其实它主要是表示,它不会指定 SpringApplication.setWebApplicationType。以非 Web 环境来运行。也就是非 Servlet 和 Reactive 环境。
- RANDOM_PORT:创建一个 web 应用程序上下文,可以是 reactive,也可以是 servlet。它将随机起一个端口并监听。到底是 reactive 还是 Servlet,它会自己根据上下文来判断。
有些人认为,Mock 和 NONE 的作用重复了,其实并没有。
WebApplicationType 的类型有 3 种。
- WebApplicationType.REACTIVE:Web Reactive
- WebApplicationType.SERVLET:Web Servlet
- WebApplicationType.NONE:非 Web
static WebApplicationType deduceFromClasspath() {
if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null)
&& !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null)
&& !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) {
return WebApplicationType.REACTIVE;
}
for (String className : SERVLET_INDICATOR_CLASSES) {
if (!ClassUtils.isPresent(className, null)) {
return WebApplicationType.NONE;
}
}
return WebApplicationType.SERVLET;
}
最后说一点,还有不少人的文章说,SpringBootTest.WebEnvironment.RANDOM_PORT 必须或通常和 @LocalServerPort 一起使用。官方文档并没有这么说,我本人就很少使用 @LocalServerPort。
: » 说一说SpringBootTest.WebEnvironment
原创文章,作者:Carrie001128,如若转载,请注明出处:https://blog.ytso.com/252229.html