探索 Spring Boot 的 TestRestTemplate

更新于 2025-12-30

baeldung 2025-12-17

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);

尽管这两个类非常相似,但 TestRestTemplate 并未继承自 RestTemplate,并且提供了一些令人兴奋的新特性。

4. TestRestTemplate 的新特性

4.1. 支持基本认证(Basic Auth)凭据的构造函数

TestRestTemplate 提供了一个构造函数,允许我们创建一个带有指定基本认证凭据的模板。

使用此实例发起的所有请求都将使用提供的凭据进行身份验证:

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 包含以下选项:ENABLE_COOKIESENABLE_REDIRECTSSSL

来看一个快速示例:

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);

在上面的例子中,我们将这些选项与基本认证一起使用。

如果我们不需要认证,也可以使用一个更简单的构造函数:

new TestRestTemplate(TestRestTemplate.HttpClientOption.ENABLE_COOKIES)

4.3. 新增方法:withBasicAuth()

除了通过构造函数设置凭据外,我们还可以在模板创建后动态添加认证信息。TestRestTemplate 提供了 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 的包装器使用,例如当你因处理遗留代码而必须使用 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 的包装器使用。