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_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);
在上面的例子中,我们将这些选项与基本认证一起使用。
如果我们不需要认证,也可以使用一个更简单的构造函数:
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 的包装器使用。