[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-kak-testirovat-spring-prilozheniya-kakie-osnovnye-annotatsii-dlya-testirovaniya":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},653,"kak-testirovat-spring-prilozheniya-kakie-osnovnye-annotatsii-dlya-testirovaniya",14,"spring","Spring","🌱","Как тестировать Spring-приложения? Какие основные аннотации для тестирования?","Spring Boot предоставляет инструментарий для тестирования на всех уровнях: от unit-тестов без контекста до полноценных интеграционных тестов.\n\n### Основные аннотации\n\n| Аннотация | Что поднимает | Скорость |\n|-----------|---------------|----------|\n| (без Spring) | Ничего, чистый Mockito | Быстро |\n| `@WebMvcTest` | Только веб-слой (контроллеры) | Быстро |\n| `@DataJpaTest` | Только JPA-слой (репозитории) | Средне |\n| `@SpringBootTest` | Полный контекст приложения | Медленно |\n\n### 1. Unit-тесты (без Spring-контекста)\n\n```java\nclass UserServiceTest {\n    @Mock private UserRepository userRepository;\n    private UserService userService;\n\n    @BeforeEach\n    void setUp() {\n        MockitoAnnotations.openMocks(this);\n        userService = new UserService(userRepository);\n    }\n\n    @Test\n    void shouldFindUserById() {\n        when(userRepository.findById(1L)).thenReturn(Optional.of(new User(1L, \"Ivan\")));\n        UserDto result = userService.findById(1L);\n        assertThat(result.getName()).isEqualTo(\"Ivan\");\n    }\n}\n```\n\n### 2. @WebMvcTest -- тест контроллера\n\n```java\n@WebMvcTest(UserController.class)\nclass UserControllerTest {\n    @Autowired private MockMvc mockMvc;\n    @MockBean private UserService userService; \u002F\u002F Spring-мок в контексте\n\n    @Test\n    void shouldReturnUser() throws Exception {\n        when(userService.findById(1L)).thenReturn(new UserDto(1L, \"Ivan\", \"ivan@mail.ru\"));\n        mockMvc.perform(get(\"\u002Fapi\u002Fusers\u002F1\"))\n                .andExpect(status().isOk())\n                .andExpect(jsonPath(\"$.name\").value(\"Ivan\"));\n    }\n}\n```\n\n### 3. @DataJpaTest -- тест репозитория\n\n```java\n@DataJpaTest\n@ActiveProfiles(\"test\")\nclass UserRepositoryTest {\n    @Autowired private UserRepository userRepository;\n    @Autowired private TestEntityManager entityManager;\n\n    @Test\n    void shouldFindByEmail() {\n        entityManager.persistAndFlush(new User(\"Ivan\", \"ivan@mail.ru\"));\n        Optional\u003CUser> found = userRepository.findByEmail(\"ivan@mail.ru\");\n        assertThat(found).isPresent();\n    }\n}\n```\n\n### 4. @SpringBootTest -- интеграционный тест\n\n```java\n@SpringBootTest\n@ActiveProfiles(\"test\")\nclass UserServiceIntegrationTest {\n    @Autowired private UserService userService;\n\n    @Test @Transactional\n    void shouldCreateUser() {\n        UserDto result = userService.create(new CreateUserRequest(\"Ivan\", \"ivan@mail.ru\"));\n        assertThat(result.getId()).isNotNull();\n    }\n}\n```\n\n> **На собеседовании:** покажите знание «слайс-тестов» и когда что использовать. Частая ошибка -- использовать `@SpringBootTest` для всех тестов (медленно). Также -- путать `@Mock` (Mockito) и `@MockBean` (Spring): `@Mock` не подменяет бин в контексте.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":19,"featuredSnippetReady":22},"Как тестировать Spring-приложения? Какие основные аннотации  — Gymterview","Spring Boot предоставляет инструментарий для тестирования на всех уровнях: от unit-тестов без контекста до полноценных интеграционных тестов.","Spring Boot предоставляет инструментарий для тестирования на всех уровнях: от unit-тестов без контекста до полноценных и",[7,13],true]