千家信息网

怎么创建WebTestClient

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇内容介绍了"怎么创建WebTestClient"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!We
千家信息网最后更新 2025年02月01日怎么创建WebTestClient

本篇内容介绍了"怎么创建WebTestClient"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

WebTestClient

WebTestClient是围绕WebClient的薄壳,可用于执行请求并公开专用的流利API来验证响应。 WebTestClient通过使用模拟请求和响应绑定到WebFlux应用程序,或者它可以通过HTTP连接测试任何Web服务器。

3.7.1 安装

要创建WebTestClient,必须选择多个服务器设置选项之一。实际上,你是在配置WebFlux应用程序以绑定到该URL,还是使用URL连接到正在运行的服务器。

绑定到控制器

以下示例显示如何创建服务器设置以一次测试一个@Controller

client = WebTestClient.bindToController(new TestController()).build();

前面的示例加载WebFlux Java配置并注册给定的控制器。使用模拟请求和响应对象,可以在没有HTTP服务器的情况下测试生成的WebFlux应用程序。构建器上有更多方法可以定制默认WebFlux Java配置。

绑定到路由器功能

以下示例显示了如何通过RouterFunction设置服务器:

RouterFunction route = ...client = WebTestClient.bindToRouterFunction(route).build();

在内部,配置被传递到RouterFunctions.toWebHandler。使用模拟请求和响应对象,可以在没有HTTP服务器的情况下测试生成的WebFlux应用程序。

绑定到ApplicationContext

以下示例显示了如何通过应用程序或其部分子集的Spring配置来设置服务器:

@SpringJUnitConfig(WebConfig.class) //1class MyTests {    WebTestClient client;    @BeforeEach    void setUp(ApplicationContext context) {  //2        client = WebTestClient.bindToApplicationContext(context).build(); //3    }}
  1. 指定要加载的配置

  2. 注入配置

  3. 创建WebTestClient

在内部,配置被传递到WebHttpHandlerBuilder以建立请求处理链。有关更多详细信息,请参见WebHandler API。使用模拟请求和响应对象,可以在没有HTTP服务器的情况下测试生成的WebFlux应用程序。

绑定到服务器

以下服务器设置选项使你可以连接到正在运行的服务器:

client = WebTestClient.bindToServer().baseUrl("http://localhost:8080").build();

客户端构建者

除了前面介绍的服务器设置选项之外,你还可以配置客户端选项、包括基本URL、默认标头,客户端过滤器等。这些选项在bindToServer之后很容易获得。对于所有其他服务器,你需要使用configureClient()从服务器配置过渡到客户端配置,如下所示:

client = WebTestClient.bindToController(new TestController())        .configureClient()        .baseUrl("/test")        .build();

3.7.2 写测试

WebTestClient提供了与WebClient相同的API,直到使用exchange()执行请求为止。 exchange()之后是链接的API工作流,用于验证响应。

通常,首先声明响应状态和标头,如下所示:

client.get().uri("/persons/1")            .accept(MediaType.APPLICATION_JSON)            .exchange()            .expectStatus().isOk()            .expectHeader().contentType(MediaType.APPLICATION_JSON)

然后,你指定如何解码和使用响应主体:

  • ExpectBody(Class ):解码为单个对象。

  • ExpectBodyList(Class ):解码并将对象收集到List

  • ExpectBody():解码为byte []以获取JSON内容或一个空的正文。

然后,你可以为主体使用内置的断言。以下示例显示了一种方法:

client.get().uri("/persons")        .exchange()        .expectStatus().isOk()        .expectBodyList(Person.class).hasSize(3).contains(person);

你还可以超越内置的断言并创建自己的断言,如以下示例所示:

import org.springframework.test.web.reactive.server.expectBodyclient.get().uri("/persons/1")        .exchange()        .expectStatus().isOk()        .expectBody(Person.class)        .consumeWith(result -> {            // custom assertions (e.g. AssertJ)...        });

你还可以退出工作流程并获得结果,如下所示:

EntityExchangeResult result = client.get().uri("/persons/1")        .exchange()        .expectStatus().isOk()        .expectBody(Person.class)        .returnResult();

当你需要使用泛型解码为目标类型时,请寻找接受ParameterizedTypeReference而不是Class 的重载方法。

无内容

如果响应没有内容(或者你不在乎),请使用Void.class,以确保释放资源。以下示例显示了如何执行此操作:

client.get().uri("/persons/123")        .exchange()        .expectStatus().isNotFound()        .expectBody(Void.class);

或者,如果要断言没有响应内容,则可以使用类似于以下内容的代码:

client.post().uri("/persons")        .body(personMono, Person.class)        .exchange()        .expectStatus().isCreated()        .expectBody().isEmpty();

JSON内容

当你使用ExpectBody()时,响应以byte[]的形式使用。这对于原始内容声明很有用。例如,你可以使用JSONAssert来验证JSON内容,如下所示:

client.get().uri("/persons/1")        .exchange()        .expectStatus().isOk()        .expectBody()        .json("{\"name\":\"Jane\"}")

你还可以使用JSONPath表达式,如下所示:

client.get().uri("/persons")        .exchange()        .expectStatus().isOk()        .expectBody()        .jsonPath("$[0].name").isEqualTo("Jane")        .jsonPath("$[1].name").isEqualTo("Jason");

流式响应

要测试无限流(例如," text/event-stream"或" application/stream + json"),你需要在响应状态和响应头断言之后立即退出链接的API(通过使用returnResult),如下所示示例显示:

FluxExchangeResult result = client.get().uri("/events")        .accept(TEXT_EVENT_STREAM)        .exchange()        .expectStatus().isOk()        .returnResult(MyEvent.class);

现在,你可以使用Flux ,在到达解码对象时对其进行断言,然后在达到测试目标时在某个时候取消。我们建议使用反应堆测试模块中的StepVerifier进行此操作,如以下示例所示:

Flux eventFlux = result.getResponseBody();StepVerifier.create(eventFlux)        .expectNext(person)        .expectNextCount(4)        .consumeNextWith(p -> ...)        .thenCancel()        .verify();

请求体

当涉及到构建请求时,WebTestClient提供了与WebClient相同的API,实现主要是简单的传递。

"怎么创建WebTestClient"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

服务器 服务 配置 内容 示例 测试 对象 应用程序 程序 应用 客户 客户端 情况 更多 方法 生成 验证 相同 实际 控制器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 防范网络安全的寄语 服务器u位 徐州江苏高性能服务器供应商家 开源技术网络安全 软件开发商为什么被垫资 供销社网络安全周活动总结 激光雷达教学实训软件开发 软件开发功能模块与功能点 易汇宝网络技术公司干嘛的 哪种设计模式可以加快数据库访问 公安部网络安全工作会议 软件开发支付系统涉及技术 网络安全单位领导事迹 中国网络安全保卫战 内网代理 外网代理服务器 王者荣耀清除登录过的服务器 windows7同步时间服务器 服务器的热机 智慧校园里的网络安全 富民智能化软件开发 霏凡软件开发者 我的世界九年无人管理服务器 主机屋服务器 怎么管理 自学计算机网络技术难吗 台儿庄区易乐网络技术服务中心 数据库技术中的关系模型 阴阳师秋之风服务器平台 seer数据库一般什么时候更新 织梦 连接数据库失败 dnf选择服务器只有两个
0