要设置一个 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) {
// 创建 WebTestClient
client = 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 {
@Autowired
WebApplicationContext wac;
WebTestClient client;
@BeforeEach
void 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();