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; 
相关推荐
码云数智-园园2 小时前
C++20 Modules 模块详解
java·开发语言·spring
咖啡八杯3 小时前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
Flittly3 小时前
【AgentScope Java新手村系列】(10)实战-多Agent天气助手
java·spring boot·spring
李少兄3 小时前
从原理到实战:Spring IoC/DI 核心知识体系与高频面试题全解
java·后端·spring
许彰午4 小时前
39_Java单元测试JUnit入门
java·junit·单元测试
shushangyun_4 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
慧一居士4 小时前
Feign的GET请求如何传递对象参数?
java·spring cloud
ofoxcoding4 小时前
在AI API聚合平台配置DeepSeek V3.2提示词缓存实战:快速接入与成本优化指南
人工智能·spring·缓存·ai
一杯奶茶¥6 小时前
水果销售网站 CRM客户信息管理系统 超市管理系 酒店管理系统 健身房管理系统 在线音乐网站 校园招聘系统
java·vue.js·spring boot·mysql·spring·java项目
摇滚侠7 小时前
SpringMVC 入门到实战 RESTFul 49-55
java·开发语言·后端·spring·intellij-idea·restful