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()