使用 WebClient 进行 Spring 引导集成测试
Using WebClient for Spring Boot integration testing
我正在尝试将 Spring 引导应用程序的一些集成测试从 RestTemplate
迁移到 WebClient
。目前,测试使用 TestRestTemplate
的自动装配实例
@Autowired
private TestRestTemplate restTemplate;
当测试 运行 时,restTemplate
配置为使用与服务器 运行 相同的基础 URL 和(随机选择的)端口。
在我的一项测试中,我登录并保存授权响应 header 值以供后续 API 调用使用。我试过像这样将其迁移到 WebClient
WebClient webClient = WebClient.create()
var authResult = webClient.post()
.uri("/api/authenticate")
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(new LoginDetails(username, password))
.retrieve()
.toBodilessEntity()
.block();
// save the token that was issued and use it for subsequent requests
this.authHeader = authResult.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
但是当我像这样创建 WebClient
实例时,它没有配置为使用与应用程序相同的端口。
我尝试使用 TestWebClient
的 dependency-injected 实例
@Autowired
private WebTestClient webTestClient;
这确实将 Web 客户端连接到服务器(相同的基础 URL 和端口),但是 WebTestClient
API 与 API 有很大不同16=]。具体来说,它似乎只允许断言响应的属性,例如您可以断言特定响应 header 值存在,但无法保存该 header 的值。
var authResult = webTestClient.post()
.uri("/api/authenticate")
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(new LoginDetails(username, password))
.exchange()
.expectHeader()
.exists(HttpHeaders.AUTHORIZATION);
有没有办法:
- 创建一个
WebClient
实例,配置为使用与服务器相同的基础 URL 和端口
- 创建一个
WebTestClient
实例并 访问 响应属性(而不是仅仅声明它们)
您可以完全访问 WebTestClient
结果:
webTestClient.post()
.uri("/api/authenticate")
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(new LoginDetails(username, password))
.exchange()
.expectHeader()
.exists(HttpHeaders.AUTHORIZATION)
.returnResult(Map.class);
我正在尝试将 Spring 引导应用程序的一些集成测试从 RestTemplate
迁移到 WebClient
。目前,测试使用 TestRestTemplate
@Autowired
private TestRestTemplate restTemplate;
当测试 运行 时,restTemplate
配置为使用与服务器 运行 相同的基础 URL 和(随机选择的)端口。
在我的一项测试中,我登录并保存授权响应 header 值以供后续 API 调用使用。我试过像这样将其迁移到 WebClient
WebClient webClient = WebClient.create()
var authResult = webClient.post()
.uri("/api/authenticate")
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(new LoginDetails(username, password))
.retrieve()
.toBodilessEntity()
.block();
// save the token that was issued and use it for subsequent requests
this.authHeader = authResult.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
但是当我像这样创建 WebClient
实例时,它没有配置为使用与应用程序相同的端口。
我尝试使用 TestWebClient
@Autowired
private WebTestClient webTestClient;
这确实将 Web 客户端连接到服务器(相同的基础 URL 和端口),但是 WebTestClient
API 与 API 有很大不同16=]。具体来说,它似乎只允许断言响应的属性,例如您可以断言特定响应 header 值存在,但无法保存该 header 的值。
var authResult = webTestClient.post()
.uri("/api/authenticate")
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(new LoginDetails(username, password))
.exchange()
.expectHeader()
.exists(HttpHeaders.AUTHORIZATION);
有没有办法:
- 创建一个
WebClient
实例,配置为使用与服务器相同的基础 URL 和端口 - 创建一个
WebTestClient
实例并 访问 响应属性(而不是仅仅声明它们)
您可以完全访问 WebTestClient
结果:
webTestClient.post()
.uri("/api/authenticate")
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(new LoginDetails(username, password))
.exchange()
.expectHeader()
.exists(HttpHeaders.AUTHORIZATION)
.returnResult(Map.class);