要设置一个 WebTestClient,你需要选择一个服务器设置来与之绑定。这可以是几个模拟服务器设置中的一个,也可以是与一个实时服务器的连接。
绑定到控制器(Controller)
这种设置允许你通过模拟请求和响应对象来测试特定的控制器,而不需要运行服务器。
对于 WebFlux 应用程序,使用以下方法,加载相当于 WebFlux Java 配置 的基础设施,注册给定的控制器,并创建一个 WebHandler 链 来处理请求。
WebTestClient client =WebTestClient.bindToController(new TestController()).build();
对于 Spring MVC,使用下面的方法,它委托 StandaloneMockMvcBuilder 加载相当于 WebMvc Java 配置 的基础设施,注册给定的控制器,并创建一个 MockMvc 的实例来处理请求。
WebTestClient client =MockMvcWebTestClient.bindToController(new TestController()).build();
绑定 ApplicationContext
这种设置允许你用 Spring MVC 或 Spring WebFlux 基础设施和控制器声明加载 Spring 配置,并通过模拟请求和响应对象使用它来处理请求,而无需运行服务器。
对于 WebFlux,使用下面的方法,其中 Spring ApplicationContext 被传递给 WebHttpHandlerBuilder 以创建 WebHandler 链来处理请求:
// 指定要加载的配置@SpringJUnitConfig(WebConfig.class)class MyTests {WebTestClient client;@BeforeEach// 注入配置void setUp(ApplicationContext context) {// 创建 WebTestClientclient = WebTestClient.bindToApplicationContext(context).build();}}
对于 Spring MVC,使用下面的方法,其中 Spring ApplicationContext 被传递给 MockMvcBuilders.webAppContextSetup 来创建一个 MockMvc 实例来处理请求。
@ExtendWith(SpringExtension.class)@WebAppConfiguration("classpath:META-INF/web-resources")@ContextHierarchy({@ContextConfiguration(classes = RootConfig.class),@ContextConfiguration(classes = WebConfig.class)})class MyTests {@AutowiredWebApplicationContext wac;WebTestClient client;@BeforeEachvoid setUp() {client = MockMvcWebTestClient.bindToApplicationContext(this.wac).build();}}
绑定到路由器功能
这种设置允许你通过模拟请求和响应对象来测试功能端点,而无需运行服务器。
对于 WebFlux 来说,使用下面这个委托给 RouterFunctions.toWebHandler 的方法来创建一个服务器设置来处理请求:
RouterFunction<?> route = ...client = WebTestClient.bindToRouterFunction(route).build();
对于 Spring MVC,目前还没有测试 WebMvc 功能端点的选项。
Bind to Server
这个设置连接到一个正在运行的服务器,以执行完整的、端到端的 HTTP 测试。
client = WebTestClient.bindToServer().baseUrl("http://localhost:8080").build();
Client Config
除了前面描述的服务器设置选项外,你还可以配置客户端选项,包括基本 URL、默认头文件、客户端过滤器等。这些选项在 bindToServer()之后可以随时使用。对于所有其他配置选项,你需要使用 configureClient()来从服务器配置过渡到客户端配置,如下所示。
client = WebTestClient.bindToController(new TestController()).configureClient().baseUrl("/test").build();
