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

集成测试中Spring Eureka场景下OpenFeign调用的WireMock Mock方案咨询

问题解决方案

问题根源:测试环境中Eureka未注册SESSION-MANAGER实例,Feign负载均衡器无法解析服务实例, fallback直接将服务名作为主机发起请求,导致UnknownHostException。以下是几种可行的Mock方案:

方案1:直接为Feign客户端指定WireMock地址(推荐,轻量高效)

在测试环境配置(如application-test.yml)中,给目标Feign客户端绑定WireMock的地址,让Feign绕过Eureka服务发现,直接请求Mock服务:

feign:
  client:
    config:
      SESSION-MANAGER: # 对应FeignClient注解的服务名
        url: "http://localhost:${wiremock.server.port}" # 绑定WireMock的地址,端口用占位符自动获取
        connectTimeout: 600000
        readTimeout: 600000
        logger-level: basic

也可以在测试类中通过注解直接注入配置:

@TestPropertySource(properties = {
    "feign.client.config.SESSION-MANAGER.url=http://localhost:${wiremock.server.port}"
})
@SpringBootTest
public class MyServiceTest {
    // WireMock初始化和测试逻辑
}

方案2:禁用Eureka客户端服务发现

如果测试不需要验证服务发现逻辑,可以直接关闭Eureka客户端,让Feign默认使用指定的URL发起请求:
在测试配置中添加:

eureka:
  client:
    enabled: false

同时配合方案1的Feign地址配置,即可让请求直接指向WireMock。

方案3:Testcontainers启动Eureka并注册WireMock(仅适用于服务发现逻辑测试)

如果需要验证完整的服务发现、负载均衡流程,可以用Testcontainers启动Eureka容器,并将WireMock实例注册到Eureka中:

  1. 引入Eureka的Testcontainers镜像依赖
  2. 启动Eureka容器,修改测试环境的Eureka配置指向容器地址:
eureka:
  client:
    serviceUrl:
      defaultZone: "http://${testcontainers.eureka.host}:${testcontainers.eureka.port}/eureka/"
  1. 编写代码将WireMock注册到Eureka:
@Autowired
private DiscoveryClient discoveryClient;

@BeforeEach
void registerWireMockToEureka() {
    InstanceInfo instanceInfo = InstanceInfo.Builder.newBuilder()
        .setAppName("SESSION-MANAGER")
        .setIPAddr("localhost")
        .setPort(wireMockServer.port())
        .setStatus(InstanceInfo.InstanceStatus.UP)
        .build();
    discoveryClient.registerInstance("SESSION-MANAGER", instanceInfo);
}

此方案较重,仅在需要测试服务发现相关逻辑时使用。

内容的提问来源于stack exchange,提问作者Andrei Kulik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:35:02