集成测试中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中:
- 引入Eureka的Testcontainers镜像依赖
- 启动Eureka容器,修改测试环境的Eureka配置指向容器地址:
eureka: client: serviceUrl: defaultZone: "http://${testcontainers.eureka.host}:${testcontainers.eureka.port}/eureka/"
- 编写代码将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
相关产品推荐
相关产品推荐

