WebTestClient – это HTTP-клиент, предназначенный для тестирования серверных приложений. Он оборачивает WebClient из Spring и использует его для выполнения запросов, но открывает фасад тестирования для проверки ответов. WebTestClient можно использовать для выполнения сквозных HTTP-тестов. Его также можно использовать для тестирования приложений Spring MVC и Spring WebFlux без работающего сервера с помощью имитации объектов-запросов и объектов-ответов сервера.

Настройка

Чтобы настроить WebTestClient, необходимо выбрать серверную настройку для привязки. Это может быть один из нескольких параметров настройки имитируемого сервера или подключение к реальному серверу.

Привязка к контроллеру

Такая настройка позволяет тестировать конкретный контроллер(ы) с помощью имитируемых объектов-запросов и объектов-ответов без работающего сервера.

Для приложений WebFlux используйте следующую конфигурацию, которая загружает инфраструктуру, эквивалентную Java-конфигурации WebFlux, регистрирует заданный контроллер(ы) и создает цепочку WebHandler для обработки запросов:

Java
WebTestClient client =
        WebTestClient.bindToController(new TestController()).build();
Kotlin
val client = WebTestClient.bindToController(TestController()).build()

Для Spring MVC используйте следующую конфигурацию, которая делегирует StandaloneMockMvcBuilder полномочия на загрузку инфраструктуры, эквивалентной Java-конфигурации WebMvc, регистрирует заданный контроллер(ы) и создает экземпляр MockMvc для обработки запросов:

Java
WebTestClient client =
        MockMvcWebTestClient.bindToController(new TestController()).build();
Kotlin
val client = MockMvcWebTestClient.bindToController(TestController()).build()

Привязка к ApplicationContext

Эта настройка позволяет загрузить конфигурацию Spring с инфраструктурой из Spring MVC или Spring WebFlux и объявлениями контроллеров, а также использовать ее для обработки запросов с помощью имитируемых объектов-запросов и объектов-ответов без работающего сервера.

Для WebFlux используйте следующую конфигурацию, где ApplicationContext из Spring передается WebHttpHandlerBuilder, чтобы создать цепочку WebHandler для обработки запросов:

Java
@SpringJUnitConfig(WebConfig.class) 
class MyTests {
    WebTestClient client;
    @BeforeEach
    void setUp(ApplicationContext context) {  
        client = WebTestClient.bindToApplicationContext(context).build(); 
    }
}
  1. Укажите конфигурацию для загрузки
  2. Внедрите конфигурацию
  3. Создайте WebTestClient
Kotlin
@SpringJUnitConfig(WebConfig::class) 
class MyTests {
    lateinit var client: WebTestClient
    @BeforeEach
    fun setUp(context: ApplicationContext) { 
        client = WebTestClient.bindToApplicationContext(context).build() 
    }
}
  1. Укажите конфигурацию для загрузки
  2. Внедрите конфигурацию
  3. Создайте WebTestClient

Для Spring MVC используйте следующую конфигурацию, где ApplicationContext из Spring передается в MockMvcBuilders.webAppContextSetup, чтобы создать экземпляр MockMvc для обработки запросов:

Java
@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(); 
    }
}
  1. Укажите конфигурацию для загрузки
  2. Внедрите конфигурацию
  3. Создайте WebTestClient
Kotlin
@ExtendWith(SpringExtension.class)
@WebAppConfiguration("classpath:META-INF/web-resources") 
@ContextHierarchy({
    @ContextConfiguration(classes = RootConfig.class),
    @ContextConfiguration(classes = WebConfig.class)
})
class MyTests {
    @Autowired
    lateinit var wac: WebApplicationContext; 
    lateinit var client: WebTestClient
    @BeforeEach
    fun setUp() { 
        client = MockMvcWebTestClient.bindToApplicationContext(wac).build() 
    }
}
  1. Укажите конфигурацию для загрузки
  2. Внедрите конфигурацию
  3. Создайте WebTestClient

Привязка к функции маршрутизатора

Такая настройка позволяет тестировать функциональные конечные точки с помощью имитируемых объектов-запросов и объектов-ответов без работающего сервера.

Для WebFlux используйте следующую конфигурацию, которая делегирует RouterFunctions.toWebHandler полномочия на создание серверной настройки для обработки запросов:

Java
RouterFunction<?> route = ...
client = WebTestClient.bindToRouterFunction(route).build();
Kotlin
val route: RouterFunction<*> = ...
val client = WebTestClient.bindToRouterFunction(route).build()

Для Spring MVC в настоящее время отсутствуют опции тестирования функциональных конечных точек WebMvc.

Привязка к серверу

Эта настройка подключается к работающему серверу для выполнения полных сквозных HTTP-тестов:

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

Конфигурация клиента

В дополнение к параметрам настройки сервера, описанным ранее, вы также можете настроить параметры клиента, включая базовый URL-адрес, заголовки по умолчанию, фильтры клиента и другое. Доступ к этим опциям легко можно получить после выполнения bindToServer(). Для всех остальных вариантов конфигурации необходимо использовать configureClient(), чтобы перейти от конфигурации сервера к конфигурации клиента, как это показано ниже:

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