如何通过集成测试确保Spring Boot 3 Reactive应用始终使用Netty服务器
确保Spring Boot 3响应式应用使用Netty服务器的集成测试实现
核心思路
通过集成测试验证应用启动后加载的Web服务器实现类为Netty,同时确保Web应用类型为响应式(REACTIVE),避免因误引入阻塞式Web依赖导致服务器切换。
具体实现方案
方案1:直接验证WebServer工厂类型
在集成测试中,从Spring容器中获取ReactiveWebServerFactory实例,检查其是否为Netty对应的实现类:
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.web.reactive.server.ReactiveWebServerFactory; import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory; import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class NettyServerValidationTest { @Autowired private ReactiveWebServerFactory webServerFactory; @Test void serverFactoryShouldBeNetty() { assertThat(webServerFactory).isInstanceOf(NettyReactiveWebServerFactory.class); } }
方案2:双重验证Web类型与服务器属性
同时校验应用的Web类型为响应式,且不存在Tomcat相关配置,避免服务器被切换:
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.env.Environment; import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class ReactiveServerValidationTest { @Autowired private Environment environment; @Test void webApplicationTypeShouldBeReactive() { String webType = environment.getProperty("spring.main.web-application-type"); assertThat(webType).isEqualTo("REACTIVE"); } @Test void serverImplementationShouldBeNetty() { // 验证Netty配置存在 boolean hasNettyConfig = environment.containsProperty("server.netty"); assertThat(hasNettyConfig).isTrue(); // 确保Tomcat配置不存在 boolean hasTomcatConfig = environment.containsProperty("server.tomcat"); assertThat(hasTomcatConfig).isFalse(); } }
方案3:启动时主动校验(可选)
除了测试,还可以在应用启动阶段直接校验,一旦检测到非Netty服务器就终止启动,提前发现问题:
import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; import org.springframework.boot.web.reactive.server.ReactiveWebServerFactory; import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory; @Component public class NettyServerGuard implements ApplicationListener<ApplicationStartedEvent> { @Override public void onApplicationEvent(ApplicationStartedEvent event) { ReactiveWebServerFactory factory = event.getApplicationContext().getBean(ReactiveWebServerFactory.class); if (!(factory instanceof NettyReactiveWebServerFactory)) { throw new IllegalStateException("应用必须使用Netty服务器,当前服务器类型:" + factory.getClass().getName()); } } }
额外建议
- 在构建文件中显式排除可能引入的阻塞式Web依赖,比如第三方依赖间接引入
spring-boot-starter-web时,主动排除:
Maven示例:<dependency> <groupId>第三方依赖groupId</groupId> <artifactId>第三方依赖artifactId</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </exclusion> </exclusions> </dependency> - 确保项目中仅引入
spring-boot-starter-webflux作为Web依赖,避免同时添加spring-boot-starter-web。
内容的提问来源于stack exchange,提问作者detomarco
相关产品推荐
相关产品推荐

