springcloud+openFeign单元测试解决初始化循环依赖的问题

  1. 项目使用了 OpenFeign
  2. Feign 在初始化时,会试图获取 Spring MVC 的相关配置
  3. 同时,Spring MVC 的自动配置(WebMvcAutoConfiguration)又在等待 Feign 或其他 Bean初始化完成。
  4. 这会导致死锁/循环依赖,导致 Context 启动失败。

前提是需要使用到上下文,如注入别的Bean,调用服务等

测试环境会尝试加载所有自动配置,包括 Feign 和 WebMvc,而它们在没有完整运行环境(如 Nacos 服务发现)时容易打架。

最终解决办法:

java 复制代码
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
java 复制代码
@SpringBootTest(
    classes = XxxApplication.class,
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)

webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT

这是 Spring Boot 测试中的一个关键配置参数,它的核心含义是:

"请启动一个真实的、嵌入式的 Web 服务器(如 Tomcat),并让它监听一个随机的、未被占用的端口。"

从对比和原理两个角度来看:

特性 默认模式 (不写参数) RANDOM_PORT 模式
对应枚举 WebEnvironment.MOCK WebEnvironment.RANDOM_PORT
服务器状态 ❌ 不启动真实的 Tomcat/Jetty ✅ 启动真实的嵌入式服务器
网络请求 无法通过 HTTP 访问 (只能用 MockMvc) 可以通过 http://localhost:随机端口 真实访问
Bean 初始化 模拟 Servlet 环境,部分 Web Bean 延迟或特殊初始化 完整模拟生产环境,所有 Web Bean 按真实顺序初始化
端口号 无端口 随机分配 (如 54321, 61092),避免冲突
主要用途 纯单元测试,速度快 集成测试,更接近真实运行环境

涉及循环依赖和Feign Client的问题,使用该配置,会要求Spring Boot 先启动真实的 Web 服务器。

服务器启动过程强制要求所有 Web 相关的底层设施(包括 mvcResourceUrlProvider)必须立即、完整地初始化。确保所有 Bean 按正确的生产顺序初始化,从而避开奇怪的循环依赖 Bug。

如果需要在测试代码里知道这个端口是多少,可以注入:

java 复制代码
@Autowired
private LocalServerConfig serverConfig; // 或者使用 @Value("${local.server.port}")

@Value("${local.server.port}")
private int port; 
相关推荐
QH139292318802 天前
Rohde & Schwarz FSWX3044 FSWX3026信号与频谱分析仪
网络·功能测试·单元测试·集成测试·模块测试
user_admin_god2 天前
SSE 流式响应 Chunk 被截断问题的排查与修复
java·人工智能·spring boot·spring·maven·mybatis
TE-茶叶蛋2 天前
Spring最核心扩展点:BeanPostProcessor
java·后端·spring
大龄码农-涵哥2 天前
Spring Boot项目集成AI对话:使用Spring AI打造智能客服
人工智能·spring boot·spring
Full Stack Developme2 天前
MyBatis-Plus 注解教程
java·spring·mybatis
蓝眸少年CY2 天前
(第十五篇)spring cloud之Sentinel实现熔断与限流
数据库·spring cloud·sentinel
budingxiaomoli2 天前
Spring Web MVC 知识总结
spring·mvc
小同志002 天前
⽅法注解 @Bean
java·spring·bean·maven
huipeng9262 天前
GateWay使用详解
java·spring boot·spring cloud·微服务·gateway
敖正炀2 天前
Spring 深度内核-核心容器与扩展机制-IoC 设计哲学:容器、BeanDefinition 与配置元信息
spring