知識庫 / Spring / Spring Boot RSS 訂閱

Spring Boot 中 @RestClientTest 快速指南

Spring Boot,Spring Web,Testing
HongKong
11
02:49 PM · Dec 06 ,2025

1. 簡介

本文是對 RestClientTest 註解的快速介紹。

新的註解有助於簡化並加速您 Spring 應用中 REST 客户端的測試。

2. Spring Boot Pre-1.4 中 REST 客户端支持

Spring Boot 是一個方便的框架,它提供許多自動配置的 Spring Bean 以及典型的設置,允許您將精力集中在 Spring 應用程序的代碼和業務邏輯上,而不是在配置上花費過多精力。

但在 1.3 版本中,我們對於創建或測試 REST 服務客户端的支持並不多。它的 REST 客户端支持不夠深入。

要創建 REST API 客户端,通常會使用 RestTemplate 實例。通常需要在使用前進行配置,並且配置可能因情況而異,因此 Spring Boot 不提供任何默認配置的 RestTemplate Bean。

同樣,測試 REST 客户端也一樣。在 Spring Boot 1.4.0 之前,測試 Spring REST 客户端的過程與任何其他基於 Spring 的應用程序並沒有太大區別。您會創建一個 MockRestServiceServer 實例,將其綁定到需要測試的 RestTemplate 實例,並提供請求的模擬響應,例如如下所示:

RestTemplate restTemplate = new RestTemplate();

MockRestServiceServer mockServer =
  MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/greeting"))
  .andRespond(withSuccess());

// Test code that uses the above RestTemplate ...

mockServer.verify();

你還需要初始化 Spring 容器,並確保僅加載所需的組件到上下文中,以加快上下文加載時間(以及隨之而來的測試執行時間)。

3. Spring Boot 1.4+ 中新 REST 客户端特性

在 Spring Boot 1.4 中,團隊致力於簡化和加速 REST 客户端的創建和測試。

讓我們來看看這些新特性。

3.1. 將 Spring Boot 添加到你的項目

首先,你需要確保你的項目正在使用 Spring Boot 1.4.x 或更高版本:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

最新版本可以在這裏找到:這裏

3.2. <em>RestTemplateBuilder</em>

Spring Boot 提供了自動配置的 <em>RestTemplateBuilder</em>,以簡化創建 <em>RestTemplates</em> 的過程,並提供了匹配的 <em>@RestClientTest</em> 註解,用於測試使用 <em>RestTemplateBuilder</em> 構建的客户端。 這是一個使用 <em>RestTemplateBuilder</em> 自動注入創建簡單 REST 客户端的示例:

@Service
public class DetailsServiceClient {

    private final RestTemplate restTemplate;

    public DetailsServiceClient(RestTemplateBuilder restTemplateBuilder) {
        restTemplate = restTemplateBuilder.build();
    }

    public Details getUserDetails(String name) {
        return restTemplate.getForObject("/{name}/details",
          Details.class, name);
    }
}

請注意,我們並未顯式地將 RestTemplateBuilder 實例注入到構造函數中。這要歸功於 Spring 引入的一種新特性——隱式構造函數注入,該特性在本文中進行了討論。

RestTemplateBuilder 提供了註冊消息轉換器、錯誤處理程序、URI 模板處理程序、基本授權以及您需要的任何其他自定義配置器的便捷方法。

3.3. @RestClientTest

對於使用 @RestClientTest 構建的 REST 客户端進行測試,你可以使用 SpringRunner 執行的帶有 @RestClientTest 註解的測試類。此註解會禁用完整的自動配置,僅應用於 REST 客户端測試相關的配置,即 Jackson 或 GSON 自動配置和 @JsonComponent Bean,但不包括常規 @Component Bean。

@RestClientTest 確保 Jackson 和 GSON 支持被自動配置,並且還將預配置的 @RestClientTest@RestClientTest 實例添加到上下文中。 要測試的 Bean 通過 @RestClientTest 註解的 @RestClientTest@RestClientTest 屬性(@RestClientTest@RestClientTest@RestClientTest 屬性(@RestClientTest@RestClientTest

@RunWith(SpringRunner.class)
@RestClientTest(DetailsServiceClient.class)
public class DetailsServiceClientTest {

    @Autowired
    private DetailsServiceClient client;

    @Autowired
    private MockRestServiceServer server;

    @Autowired
    private ObjectMapper objectMapper;

    @Before
    public void setUp() throws Exception {
        String detailsString = 
          objectMapper.writeValueAsString(new Details("John Smith", "john"));
        
        this.server.expect(requestTo("/john/details"))
          .andRespond(withSuccess(detailsString, MediaType.APPLICATION_JSON));
    }

    @Test
    public void whenCallingGetUserDetails_thenClientMakesCorrectCall() 
      throws Exception {

        Details details = this.client.getUserDetails("john");

        assertThat(details.getLogin()).isEqualTo("john");
        assertThat(details.getName()).isEqualTo("John Smith");
    }
}

首先,我們需要確保此測試使用 SpringRunner執行,通過添加 @RunWith(SpringRunner.class)註解來實現。

所以,有什麼新的嗎?

第一項——@RestClientTest註解允許我們指定要進行測試的精確服務——在本例中是 DetailsServiceClient 類。此服務將被加載到測試上下文中,而其他所有內容將被過濾掉。

這允許我們在測試中自動注入 DetailsServiceClient 實例,並將所有其他內容排除在外,從而加快上下文的加載速度。

第二項——由於 MockRestServiceServer 實例也配置為用於 @RestClientTest 註解的測試(並且綁定到 DetailsServiceClient 實例供我們使用),因此我們可以簡單地注入它並使用。

最後——@RestClientTest 註解支持 JSON,允許我們注入 Jackson 的 ObjectMapper 實例,以準備 MockRestServiceServer 的 mock 答案值。

剩下的就是執行對我們服務的調用並驗證結果。

4. 結論

在本文中,我們討論了新的 <em @RestClientTest> 註解,它允許輕鬆快速地測試使用 Spring 構建的 REST 客户端。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.