1. 概述
本文將探討 Spring Boot 中的 TestRestTemplate。它可視為《RestTemplate 指南》的後續內容,我們強烈建議您在深入瞭解 TestRestTemplate 之前,先閲讀該指南。 TestRestTemplate 可以被視為 RestTemplate 的一種有吸引力的替代方案。
2. Maven 依賴
要使用 TestRestTemplate,您需要添加適當的依賴項,例如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>您可以在 Maven Central 找到最新版本。
3. TestRestTemplate 和 RestTemplate
這兩個客户端都非常適合編寫集成測試,並且能夠很好地處理與 HTTP API 的通信。
它們提供了相同的標準方法、頭部和其他 HTTP 構造。
所有這些操作都詳細説明在《RestTemplate 指南》中,這裏就不再贅述。
這是一個簡單的 GET 請求示例:
TestRestTemplate testRestTemplate = new TestRestTemplate();
ResponseEntity<String> response = testRestTemplate.
getForEntity(FOO_RESOURCE_URL + "/1", String.class);
Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK);
儘管這兩個類非常相似,<em >TestRestTemplate</em> 不繼承 <em >RestTemplate</em>,但它確實提供了幾個非常令人興奮的新功能。
4. <emTestRestTemplate 中新功能
4.1. 使用基本身份驗證憑據的構造函數
<em>TestRestTemplate</em> 提供了一個構造函數,允許您創建一個帶有指定憑據的模板,用於基本身份驗證。
所有使用該實例執行的請求都將使用提供的憑據進行身份驗證:
TestRestTemplate testRestTemplate
= new TestRestTemplate("user", "passwd");
ResponseEntity<String> response = testRestTemplate.
getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class);
Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK);
4.2. 使用 HttpClientOption 的構造函數
TestRestTemplate 還允許我們使用 HttpClientOption 定製底層 Apache HTTP 客户端。 HttpClientOption 是 TestRestTemplate 中的枚舉,具有以下選項: ENABLE_COOKIES, ENABLE_REDIRECTS 和 SSL。
下面是一個快速示例:
TestRestTemplate testRestTemplate = new TestRestTemplate("user",
"passwd", TestRestTemplate.HttpClientOption.ENABLE_COOKIES);
ResponseEntity<String> response = testRestTemplate.
getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class);
Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK);在上面的示例中,我們結合使用選項和基本身份驗證。
如果不需要身份驗證,我們仍然可以創建一個帶有簡單構造函數的模板:
TestRestTemplate(TestRestTemplate.HttpClientOption.ENABLE_COOKIES)
4.3. 新方法
不僅構造函數可以創建帶有指定憑據的模板,我們還可以添加憑據到模板創建完成後。<em >TestRestTemplate</em> 提供了 withBasicAuth() 方法,該方法將憑據添加到已存在的模板中:
TestRestTemplate testRestTemplate = new TestRestTemplate();
ResponseEntity<String> response = testRestTemplate.withBasicAuth(
"user", "passwd").getForEntity(URL_SECURED_BY_AUTHENTICATION,
String.class);
Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK);
5. 使用 TestRestTemplate 和 RestTemplate
TestRestTemplate 可以作為 RestTemplate 的包裝器使用,例如當我們被迫使用它是因為我們正在處理遺留代碼時。 如下所示是如何創建這樣一個簡單的包裝器:
RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();
restTemplateBuilder.configure(restTemplate);
TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplateBuilder);
ResponseEntity<String> response = testRestTemplate.getForEntity(
FOO_RESOURCE_URL + "/1", String.class);
Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK);6. 結論
TestRestTemplate 不是 RestTemplate 的擴展,而是一個替代方案,它簡化了集成測試並促進了測試過程中的身份驗證。它有助於 Apache HTTP 客户端的定製,但也可以用作 RestTemplate 的包裝器。