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; 
相关推荐
SmartBrain4 小时前
FastAPI + LangGraph 与 SpringAI 在医疗场景应用及分析
人工智能·spring boot·spring·fastapi
Rsun045514 小时前
Spring AI + RAG + 向量库 10 道模拟面试
人工智能·spring·面试
SmartBrain4 小时前
基于 Spring AI 构建多智能体协作系统(高级版)
java·人工智能·spring
小璐资源网5 小时前
单元测试中应对外部服务依赖的实践指南
单元测试·log4j
Holen&&Beer6 小时前
Spring-Profile与部署说明
java·后端·spring
jinanmichael6 小时前
【SpringBoot】日志文件
java·spring boot·spring
⑩-7 小时前
服务注册与发现的原理?Nacos vs Eureka?
spring cloud·云原生·eureka
·中年程序渣·7 小时前
Spring AI Alibaba入门学习(六)
人工智能·学习·spring
Memory_荒年7 小时前
Spring Boot自动装配:告别“配置地狱”的智能管家
java·后端·spring