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

Spring Boot 2.7升级后,集成测试配置MockServer至服务发现失败求助

解决Spring Boot 2.7集成测试中Spring Cloud LoadBalancer配置MockWebServer失效问题

问题根源

核心问题有两个:

  • 配置的uri缺少协议前缀(http://):Spring Cloud LoadBalancer的Simple Discovery Client要求实例uri必须是完整的HTTP/HTTPS地址,仅填写host:port会被识别为无效地址。
  • 若使用@DynamicPropertySource,需确保MockWebServer实例能被静态方法访问到(静态方法无法直接引用非静态的mockServer变量)。

可行解决方案

方案1:补全协议前缀 + 修正ApplicationContextInitializer配置

修改测试配置类,给uri加上http://前缀:

@Component
static class TestConfig implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        String mockServerUri = "http://" + mockServer.getHostName() + ":" + mockServer.getPort();
        TestPropertySourceUtils.addInlinedPropertiesToEnvironment(configurableApplicationContext,
                "spring.cloud.discovery.client.simple.instances.account-service[0].uri=" + mockServerUri);
    }
}

方案2:使用@DynamicPropertySource并修正变量访问权限

将MockWebServer声明为静态变量,确保静态的dynamicProperties方法能访问到它,同时补全协议前缀:

// 把mockServer改成静态变量
private static MockWebServer mockServer;

@BeforeAll
static void setup() throws IOException {
    mockServer = new MockWebServer();
    mockServer.start();
}

@DynamicPropertySource
static void dynamicProperties(DynamicPropertyRegistry registry) {
    String mockServerUri = "http://" + mockServer.getHostName() + ":" + mockServer.getPort();
    registry.add("spring.cloud.discovery.client.simple.instances.account-service[0].uri", () -> mockServerUri);
}

额外验证步骤

  1. 确认测试类上已添加@SpringBootTest(或对应集成测试注解),确保Spring上下文正常加载。
  2. 可以在测试中注入LoadBalancerClient,打印实例列表验证配置是否生效:
@Autowired
private LoadBalancerClient loadBalancerClient;

@Test
void testMockServerInstance() {
    ServiceInstance instance = loadBalancerClient.choose("account-service");
    System.out.println("Loaded instance URI: " + instance.getUri());
    // 验证URI是否与MockWebServer地址一致
    Assertions.assertEquals(mockServer.getUrl("/").toString(), instance.getUri().toString());
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:05:13