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; 
相关推荐
dadaobusi3 小时前
Trace-driven 建模(基于轨迹/踪迹的建模)
java·后端·spring
测试员周周4 小时前
【jev应用到测试】94 条 UI 报错交给 Jev,三档判对 85.1%,开单闸门定在 0.6
人工智能·python·测试工具·单元测试·测试用例
南归北隐4 小时前
Spring AI Alibaba Graph框架实现Tools工具调用
java·后端·spring·spring ai·spring ai tools
步行cgn14 小时前
Spring 注解使用详解
java·spring
一条小小yu15 小时前
Spring IoC的理解
java·后端·spring
yychen_java18 小时前
第六篇:Spring AI 实战:将 Java 业务接口封装成企业级 MCP Server
java·人工智能·spring
m0_5873830020 小时前
24小时自助健身房软硬件解决方案实战指南:从架构设计到部署实施
java·spring·小程序·架构·需求分析
木头科技20 小时前
【AI 工程化第五篇】Spring AI Agent 生产治理实战:限流、熔断、降级、灰度、多模型路由和安全边界
人工智能·安全·spring
Thomas.Sir21 小时前
第8课:Nacos健康检测、权重配置、环境隔离实战
spring cloud·微服务
QuZhengRong1 天前
【Spring】后端接收的请求参数多了一个逗号的处理办法
java·后端·spring