1. 概述
本文深入探讨 Spring Boot 的 TestRestTemplate
。建议先阅读 RestTemplate 指南 再看本文,TestRestTemplate
可视为 RestTemplate
的一个强大替代方案。
2. Maven 依赖
使用 TestRestTemplate
需添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
最新版本可在 Maven 中央仓库 获取。
3. TestRestTemplate 与 RestTemplate 的关系
两者都适合编写集成测试,能高效处理 HTTP API 通信:
- ✅ 提供相同的标准方法(如 GET/POST)
- ✅ 支持相同的 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. 支持基本认证的构造器
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 的构造器
可通过 HttpClientOption
枚举定制底层 Apache HTTP 客户端:
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 = new TestRestTemplate(
TestRestTemplate.HttpClientOption.ENABLE_COOKIES);
4.3. 新增认证方法
除了构造器,还支持动态添加认证凭据:
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
的包装器使用
在测试场景下,它比直接使用 RestTemplate
更简单粗暴,能有效减少模板代码。