Spring Framework 6.1的RestClient是否有TestRestTemplate式测试变体及集成测试方案?
RestClient集成测试推荐方案
1. 结合Spring Boot集成测试环境直接调用
在@SpringBootTest中利用随机端口配置RestClient,直接指向启动的应用实例,适合测试自身应用的接口调用逻辑:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class RestClientIntegrationTest { private RestClient restClient; @LocalServerPort private int port; @BeforeEach void setUp() { restClient = RestClient.create("http://localhost:" + port); } @Test void testGetApiResource() { String responseBody = restClient.get() .uri("/api/demo") .retrieve() .body(String.class); assertNotNull(responseBody); // 按需添加业务断言 } }
2. 用MockWebServer模拟外部依赖
如果RestClient需要调用外部服务,使用OkHttp的MockWebServer模拟服务响应,避免依赖真实外部环境:
class RestClientExternalServiceTest { private MockWebServer mockServer; private RestClient restClient; @BeforeEach void init() throws IOException { mockServer = new MockWebServer(); mockServer.start(); restClient = RestClient.create(mockServer.url("/").toString()); } @AfterEach void cleanUp() throws IOException { mockServer.shutdown(); } @Test void testCallExternalApi() throws InterruptedException { // 预设模拟响应 mockServer.enqueue(new MockResponse() .setBody("{\"code\":200,\"data\":\"mock-data\"}") .addHeader("Content-Type", "application/json")); ApiResponse response = restClient.get() .uri("/external/api") .retrieve() .body(ApiResponse.class); assertEquals("mock-data", response.getData()); // 验证请求是否符合预期 RecordedRequest request = mockServer.takeRequest(); assertEquals("/external/api", request.getPath()); } }
3. 自定义测试专用RestClient配置
在测试上下文里配置带特殊逻辑的RestClient,比如添加测试拦截器、替换底层客户端实现:
@SpringBootTest class RestClientCustomConfigTest { @Autowired private RestClient testRestClient; @Configuration static class TestRestClientConfig { @Bean public RestClient restClient() { return RestClient.builder() .requestInterceptor((req, body, execution) -> { // 给测试请求添加专属标识头 req.getHeaders().add("X-Test-Flag", "enabled"); return execution.execute(req, body); }) .build(); } } @Test void testWithCustomClient() { // 使用配置好的testRestClient执行测试逻辑 } }
内容的提问来源于stack exchange,提问作者Wim De Troyer
相关产品推荐
相关产品推荐

