要设置一个 WebTestClient,你需要选择一个服务器设置来与之绑定。这可以是几个模拟服务器设置中的一个,也可以是与一个实时服务器的连接。

绑定到控制器(Controller)

这种设置允许你通过模拟请求和响应对象来测试特定的控制器,而不需要运行服务器。

对于 WebFlux 应用程序,使用以下方法,加载相当于 WebFlux Java 配置 的基础设施,注册给定的控制器,并创建一个 WebHandler 链 来处理请求。

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

对于 Spring MVC,使用下面的方法,它委托 StandaloneMockMvcBuilder 加载相当于 WebMvc Java 配置 的基础设施,注册给定的控制器,并创建一个 MockMvc 的实例来处理请求。

  1. WebTestClient client =
  2. MockMvcWebTestClient.bindToController(new TestController()).build();


绑定 ApplicationContext

这种设置允许你用 Spring MVC 或 Spring WebFlux 基础设施和控制器声明加载 Spring 配置,并通过模拟请求和响应对象使用它来处理请求,而无需运行服务器。

对于 WebFlux,使用下面的方法,其中 Spring ApplicationContext 被传递给 WebHttpHandlerBuilder 以创建 WebHandler 链来处理请求:

  1. // 指定要加载的配置
  2. @SpringJUnitConfig(WebConfig.class)
  3. class MyTests {
  4. WebTestClient client;
  5. @BeforeEach
  6. // 注入配置
  7. void setUp(ApplicationContext context) {
  8. // 创建 WebTestClient
  9. client = WebTestClient.bindToApplicationContext(context).build();
  10. }
  11. }

对于 Spring MVC,使用下面的方法,其中 Spring ApplicationContext 被传递给 MockMvcBuilders.webAppContextSetup 来创建一个 MockMvc 实例来处理请求。

  1. @ExtendWith(SpringExtension.class)
  2. @WebAppConfiguration("classpath:META-INF/web-resources")
  3. @ContextHierarchy({
  4. @ContextConfiguration(classes = RootConfig.class),
  5. @ContextConfiguration(classes = WebConfig.class)
  6. })
  7. class MyTests {
  8. @Autowired
  9. WebApplicationContext wac;
  10. WebTestClient client;
  11. @BeforeEach
  12. void setUp() {
  13. client = MockMvcWebTestClient.bindToApplicationContext(this.wac).build();
  14. }
  15. }

绑定到路由器功能

这种设置允许你通过模拟请求和响应对象来测试功能端点,而无需运行服务器。

对于 WebFlux 来说,使用下面这个委托给 RouterFunctions.toWebHandler 的方法来创建一个服务器设置来处理请求:

  1. RouterFunction<?> route = ...
  2. client = WebTestClient.bindToRouterFunction(route).build();

对于 Spring MVC,目前还没有测试 WebMvc 功能端点的选项

Bind to Server

这个设置连接到一个正在运行的服务器,以执行完整的、端到端的 HTTP 测试。

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

Client Config

除了前面描述的服务器设置选项外,你还可以配置客户端选项,包括基本 URL、默认头文件、客户端过滤器等。这些选项在 bindToServer()之后可以随时使用。对于所有其他配置选项,你需要使用 configureClient()来从服务器配置过渡到客户端配置,如下所示。

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