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
相关产品推荐
相关产品推荐

