Spring Cloud Feign集成WireMock测试遇Bean循环依赖异常求助
问题分析与解决方案
问题现象
Spring应用可正常启动运行,但编写Feign Client的WireMock集成测试时,出现循环依赖异常:
Error creating bean with name 'wireMockConfig': Requested bean is currently in creation: Is there an unresolvable circular reference?
代码问题点
你的WireMockConfig类中存在循环依赖:
@TestConfiguration @ActiveProfiles("test") public class WireMockConfig { @Autowired private WireMockServer wireMockServer; // 此处导致循环依赖 @Bean(initMethod = "start", destroyMethod = "stop") public WireMockServer mockServer(){ return new WireMockServer(options().dynamicPort()); } }
Spring创建WireMockConfig实例时,需要注入WireMockServer Bean,但WireMockServer是由该类内部的mockServer()方法生成的——调用这个方法需要先实例化WireMockConfig,从而形成闭环,触发循环引用异常。
修复步骤
1. 修复WireMock配置类
删除配置类中不必要的@Autowired WireMockServer字段,配置类仅负责定义Bean即可:
@TestConfiguration @ActiveProfiles("test") public class WireMockConfig { @Bean(initMethod = "start", destroyMethod = "stop") public WireMockServer mockServer(){ return new WireMockServer(options().dynamicPort()); } }
2. 配置Feign Client指向WireMock端口
Feign Client需要知道WireMock的动态端口才能发起请求,可通过@DynamicPropertySource在测试类中动态配置:
@SpringBootTest @ActiveProfiles("test") @EnableConfigurationProperties @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = {WireMockConfig.class}) class DataFeignClientIntegrationTest{ @Autowired private WireMockServer mockServer; @Autowired private YourFeignClient feignClient; // 替换为你的Feign Client实际类名 // 动态配置Feign Client的请求地址 @DynamicPropertySource static void configureFeignProperties(DynamicPropertyRegistry registry) { registry.add("feign.client.config.your-feign-client-name.url", () -> "http://localhost:" + mockServer.port()); } @BeforeEach void setup() throws Exception { DataMocks.setUpTypesResponse(mockServer); } @Test public void findTypesTest() throws Exception{ RequestParams requestParams = RequestParams.builder().build(); assertEquals(feignClient.findTypes(requestParams).getClass(), Response.class); } }
注意:将your-feign-client-name替换为你Feign Client接口上@FeignClient注解中指定的名称。
3. 可选:通过配置文件静态配置
若你使用application-test.yml配置文件,也可以手动配置端口占位符(动态配置更灵活):
feign: client: config: your-feign-client-name: url: http://localhost:${wiremock.server.port}
内容的提问来源于stack exchange,提问作者Anvesh Raavi
相关产品推荐
相关产品推荐

