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 更简单粗暴,能有效减少模板代码。


原始标题:Exploring the Spring Boot TestRestTemplate | Baeldung