[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-test-kak-testirovat-kontrollery-s-pomoshchyu-mockmvc-i-webmvctest":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},697,"kak-testirovat-kontrollery-s-pomoshchyu-mockmvc-i-webmvctest",16,"spring-test","Spring Test","🧪","Как тестировать контроллеры с помощью MockMvc и WebMvcTest?","`@WebMvcTest` — срезовая (slice) аннотация, которая поднимает только веб-слой Spring MVC: контроллеры, `@ControllerAdvice`, `@JsonComponent`, фильтры, `WebMvcConfigurer`. Сервисы, репозитории и прочие бины не загружаются — их нужно мокать.\n\n`MockMvc` — утилита для тестирования контроллеров без запуска реального HTTP-сервера. Запросы обрабатываются через `DispatcherServlet` в имитированном окружении.\n\n\u003Cdetails>\u003Csummary>Пример теста контроллера\u003C\u002Fsummary>\n\n```java\n@WebMvcTest(UserController.class)\nclass UserControllerTest {\n\n    @Autowired\n    private MockMvc mockMvc;\n\n    @MockBean\n    private UserService userService;\n\n    @Test\n    void shouldReturnAllUsers() throws Exception {\n        List\u003CUserDto> users = List.of(\n            new UserDto(1L, \"Иван\"),\n            new UserDto(2L, \"Мария\")\n        );\n        when(userService.findAll()).thenReturn(users);\n\n        mockMvc.perform(get(\"\u002Fapi\u002Fusers\")\n                .contentType(MediaType.APPLICATION_JSON))\n            .andExpect(status().isOk())\n            .andExpect(jsonPath(\"$\", hasSize(2)))\n            .andExpect(jsonPath(\"$[0].name\").value(\"Иван\"))\n            .andExpect(jsonPath(\"$[1].name\").value(\"Мария\"));\n    }\n\n    @Test\n    void shouldCreateUser() throws Exception {\n        UserDto newUser = new UserDto(null, \"Пётр\");\n        UserDto savedUser = new UserDto(1L, \"Пётр\");\n        when(userService.create(any(UserDto.class))).thenReturn(savedUser);\n\n        mockMvc.perform(post(\"\u002Fapi\u002Fusers\")\n                .contentType(MediaType.APPLICATION_JSON)\n                .content(\"{\\\"name\\\": \\\"Пётр\\\"}\"))\n            .andExpect(status().isCreated())\n            .andExpect(jsonPath(\"$.id\").value(1))\n            .andExpect(jsonPath(\"$.name\").value(\"Пётр\"));\n    }\n\n    @Test\n    void shouldReturn404WhenUserNotFound() throws Exception {\n        when(userService.findById(999L))\n            .thenThrow(new UserNotFoundException(999L));\n\n        mockMvc.perform(get(\"\u002Fapi\u002Fusers\u002F999\"))\n            .andExpect(status().isNotFound());\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### WebMvcTest vs SpringBootTest + AutoConfigureMockMvc\n\n| Критерий | `@WebMvcTest` | `@SpringBootTest` + `@AutoConfigureMockMvc` |\n|---|---|---|\n| Контекст | Только MVC-слой | Полный контекст приложения |\n| Скорость | Быстро | Медленнее |\n| Зависимости | Нужно мокать через `@MockBean` | Реальные бины доступны |\n| Применение | Unit-тесты контроллеров | Интеграционные тесты |\n\n> **На собеседовании:** интервьюер ожидает понимание разницы между `@WebMvcTest` (только MVC-слой) и `@SpringBootTest` + `@AutoConfigureMockMvc` (полный контекст). Частая ошибка — не мокать сервисы при `@WebMvcTest`, из-за чего тест падает с `NoSuchBeanDefinitionException`.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Как тестировать контроллеры с помощью MockMvc и WebMvcTest? — Gymterview","`@WebMvcTest` — срезовая (slice) аннотация, которая поднимает только веб-слой Spring MVC: контроллеры, `@ControllerAdvice`, `@JsonComponent`, фильтры, `WebMvcCo","`@WebMvcTest` — срезовая (slice) аннотация, которая поднимает только веб-слой Spring MVC: контроллеры, `@ControllerAdvic",[7,13],"`@WebMvcTest` — срезовая (slice) аннотация, которая поднимает только веб-слой Spring MVC: контроллеры, `@ControllerAdvice`, `@JsonComponent`, фильтры, `WebMvcConfigurer`. Сервисы, репозитории и прочие бины не загружаются — их нужно мокать.",true]