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

Spring Boot RestClient测试报错:MockRestServiceServer绑定失败求助

问题解决:MockRestServiceServer无法绑定RestClient的错误

出现这个错误的核心原因是:你在AbcService的构造函数中手动创建了RestClient实例,而Spring的@RestClientTest自动配置的MockRestServiceServer只能绑定由Spring容器管理的RestClient(或RestClient.Builder),无法拦截你手动new出来的实例。

修复步骤:

1. 修改AbcService,改用注入RestClient.Builder构建实例

把原来手动创建RestClient的逻辑改成注入Spring提供的RestClient.Builder,这样测试时Spring会自动给Builder添加Mock拦截器,让MockRestServiceServer能接管请求:

@Service
class AbcService {

    private final RestClient client;

    // 注入RestClient.Builder,而非手动new
    public AbcService(RestClient.Builder builder, @Value("${url}") final String url) {
        this.client = builder.baseUrl(url).build();
    }

    // 注意:原代码返回类型String是错误的,应改为AbcResponse
    AbcResponse getPlace(String id) {
        return client.get()
                .uri("places/{id}", id)
                .retrieve()
                .body(AbcResponse.class);
    }

    record AbcResponse(String id, boolean flag) {}
}

2. 调整测试代码,修正请求路径与配置方式

  • 用@TestPropertySource替代System.setProperty来配置测试用的baseUrl,更符合Spring测试规范
  • 请求路径要包含baseUrl的完整地址,因为RestClient会拼接baseUrl和uri:
@RestClientTest(AbcService.class)
@TestPropertySource(properties = "url=http://test-server") // 配置测试用baseUrl
class AbcServiceTest {
    @Autowired
    AbcService instance;

    @Autowired
    MockRestServiceServer server;

    @Test
    void testGetPlace() {
        // 完整请求路径 = baseUrl + 接口路径
        server.expect(requestTo("http://test-server/places/id1"))
                .andRespond(withSuccess(new AbcResponse("string", true), MediaType.APPLICATION_JSON));

        assertEquals(new AbcResponse("string", true), instance.getPlace("id1"));
    }
}

关键原理

@RestClientTest会自动配置MockRestServiceServerCustomizer,它会给Spring管理的RestClient.Builder添加一个拦截器,使得通过该Builder构建的RestClient所有请求都会被MockRestServiceServer拦截处理。而你原来手动创建的RestClient脱离了Spring的管理,自然无法被绑定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:16:02