当前位置: 首页 > 知识库问答 >
问题:

使用WebClient进行Spring Boot集成测试

南宫胡媚
2023-03-14

我正在尝试将Spring Boot应用程序的一些集成测试从RestTemplate迁移到WebClient。目前,测试使用的是testrestemplate

@Autowired
private TestRestTemplate restTemplate;

当测试运行时,restemplate被配置为使用与服务器运行时相同的基本URL和(随机选择的)端口。

在我的一个测试中,我登录并保存authorization-response头值,以便在后续的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和端口),但是WebTestClientAPI与WebClient有完全不同的API。具体来说,它似乎只允许断言响应的属性,例如,您可以断言存在特定的响应头值,但无法保存该头的值。

var authResult = webTestClient.post()
    .uri("/api/authenticate")
    .contentType(MediaType.APPLICATION_JSON)
    .bodyValue(new LoginDetails(username, password))
    .exchange()
    .expectHeader()
    .exists(HttpHeaders.AUTHORIZATION);

有没有办法:

  • 创建一个WebClient实例,该实例被配置为使用与服务器相同的基本URL和端口
  • 创建一个WebTestClient实例并访问响应属性(而不仅仅是断言它们)

共有1个答案

柴茂材
2023-03-14

您可以完全访问WebTestClient结果:

webTestClient.post()
                .uri("/api/authenticate")
                .contentType(MediaType.APPLICATION_JSON)
                .bodyValue(new LoginDetails(username, password))
                .exchange()
                .expectHeader()
                .exists(HttpHeaders.AUTHORIZATION)
                .returnResult(Map.class);
 类似资料:
  • 我有几个繁重的Spring集成测试(是的,这不是最好的方法,我没有时间正确地模拟所有外部dep) 下面是测试的典型注释 由于以下原因,测试会定期失败: 这里有两个问题:1、让测试共存的正确方式是什么?我在surefire插件中设置了forkCount=0。好像有帮助 2.1. 在每次测试期间,我实际上不需要启动所有的

  • Gradle4.6增加了对JUnit5的支持。 只要我没有用于例如集成测试的另一个sourceset,这对我是有效的:我不知道如何在我的集成测试中启用。 我所能做的是让任务与新的JUnit5支持一起工作,但我的任务使用JUnit5控制台并从命令行运行测试。最后,我在gradle中放弃对JUnit5的支持,并回滚到使用JUnit5控制台进行两个测试。 除了之外,如何在其他任务上启用Gradle4.6

  • 我尝试编写一个联调的Spring Data Elastisearch存储库在SpringBoot使用测试容器和junit5 org . spring framework . beans . factory . unsatisfieddependencyexception:创建名为“com . example . demo . addressrepositorytest”的bean时出错:通过字段“

  • 第一:是的,我读到了https://dropwizard.github.io/dropwizard/manual/testing.html 我想做一些集成测试,以及为什么我必须启动整个应用程序。现在的问题是,我有一些与“外部世界”的接口,如DB或一个内部的Rest-Client,它与一个远程应用程序交谈。我想用嘲弄来嘲笑他们。通常这没问题。 现在我的问题是:如何使用模拟数据库和模拟客户端启动整个应

  • 我想测试我的SpringBoot应用程序,它使用cassandra作为CrudRepository。我最终得到了 具有 和 这就导致了 如果我使用旧版本的cassandra-unit-Spring 它以NullPointerException结束,因为没有注入值repo。 来源https://github.com/StephanPraetsch/spring.boot.cassandra.unit