说一说SpringBootTest.WebEnvironment

先说一说学习方法。很多时候,我们遇到问题了都会先去百度,但是百度出来的文章不一定全对,而且技术,质量参差不齐。这个时候最好的办法是去查看官方文档,当然我们也完全不能保证官方的文档就一定正确。但我们还是应该相信官方文档,然后结合上下文来确定正确的用法。

今天周六,我在带娃,不能兼顾到大家,请互相谅解。平时也有不少网友私信我,问一些技术问题,但我个人的时间和精力都非常的有限。平时多积累知识,遇到问题才能游刃有余!

抽个时间,我来说说标题中的 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

: » 说一说SpringBootTest.WebEnvironment

原创文章,作者:Carrie001128,如若转载,请注明出处:https://blog.ytso.com/252229.html

(0)
上一篇 2022年5月4日
下一篇 2022年5月4日

相关推荐

发表回复

登录后才能评论