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 повноваження на завантаження інфраструктури, еквівалентної конфігурації 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, щоб створити екземпляр href="https://javarush.com/quests/lectures/questspring.level02.lecture15">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()