[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-test-kak-ispolzovat-webtestclient-dlya-testirovaniya-reaktivnykh-i-obychnykh-prilozheniy":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},704,"kak-ispolzovat-webtestclient-dlya-testirovaniya-reaktivnykh-i-obychnykh-prilozheniy",16,"spring-test","Spring Test","🧪","Как использовать WebTestClient для тестирования реактивных и обычных приложений?","`WebTestClient` — клиент для тестирования веб-приложений, поддерживающий как реактивные (WebFlux), так и классические (MVC) приложения. Предоставляет fluent API для выполнения запросов и проверки ответов.\n\n### С SpringBootTest (реальный сервер)\n\n\u003Cdetails>\u003Csummary>Пример кода\u003C\u002Fsummary>\n\n```java\n@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)\nclass UserControllerWebClientTest {\n\n    @Autowired\n    private WebTestClient webTestClient;\n\n    @Test\n    void shouldGetAllUsers() {\n        webTestClient.get()\n            .uri(\"\u002Fapi\u002Fusers\")\n            .accept(MediaType.APPLICATION_JSON)\n            .exchange()\n            .expectStatus().isOk()\n            .expectBodyList(UserDto.class)\n            .hasSize(3)\n            .contains(new UserDto(1L, \"Иван\"));\n    }\n\n    @Test\n    void shouldCreateUser() {\n        UserDto newUser = new UserDto(null, \"Пётр\");\n\n        webTestClient.post()\n            .uri(\"\u002Fapi\u002Fusers\")\n            .contentType(MediaType.APPLICATION_JSON)\n            .bodyValue(newUser)\n            .exchange()\n            .expectStatus().isCreated()\n            .expectBody(UserDto.class)\n            .value(user -> {\n                assertNotNull(user.getId());\n                assertEquals(\"Пётр\", user.getName());\n            });\n    }\n\n    @Test\n    void shouldReturnNotFound() {\n        webTestClient.get()\n            .uri(\"\u002Fapi\u002Fusers\u002F999\")\n            .exchange()\n            .expectStatus().isNotFound();\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Работа с JSON-телом ответа\n\n```java\n@Test\nvoid shouldVerifyResponseBody() {\n    webTestClient.get()\n        .uri(\"\u002Fapi\u002Fusers\u002F1\")\n        .exchange()\n        .expectStatus().isOk()\n        .expectBody()\n        .jsonPath(\"$.name\").isEqualTo(\"Иван\")\n        .jsonPath(\"$.email\").isNotEmpty()\n        .jsonPath(\"$.id\").isNumber();\n}\n```\n\n### С заголовками и аутентификацией\n\n```java\n@Test\nvoid shouldSendHeaders() {\n    webTestClient.get()\n        .uri(\"\u002Fapi\u002Fprotected\")\n        .header(\"Authorization\", \"Bearer jwt-token-here\")\n        .exchange()\n        .expectStatus().isOk()\n        .expectHeader().contentType(MediaType.APPLICATION_JSON)\n        .expectHeader().exists(\"X-Custom-Header\");\n}\n```\n\n> **На собеседовании:** интервьюер хочет услышать, что `WebTestClient` работает и с MVC, и с WebFlux, в отличие от `MockMvc` (только MVC) и `TestRestTemplate` (только реальный сервер). Частая ошибка — думать, что `WebTestClient` только для реактивных приложений.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Как использовать WebTestClient для тестирования реактивных и — Gymterview","`WebTestClient` — клиент для тестирования веб-приложений, поддерживающий как реактивные (WebFlux), так и классические (MVC) приложения. Предоставляет fluent API","`WebTestClient` — клиент для тестирования веб-приложений, поддерживающий как реактивные (WebFlux), так и классические (M",[7,13],"`WebTestClient` — клиент для тестирования веб-приложений, поддерживающий как реактивные (WebFlux), так и классические (MVC) приложения. Предоставляет fluent API для выполнения запросов и проверки ответов.",true]