You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 12:41:27