Gymterview
middle

Какие режимы webEnvironment существуют в SpringBootTest?

Параметр webEnvironment аннотации @SpringBootTest определяет, как будет запущено веб-окружение.

Режим Описание
MOCK (по умолчанию) Создаёт mock-веб-окружение. Реальный сервер не запускается. Используется совместно с MockMvc.
RANDOM_PORT Запускает реальный веб-сервер на случайном свободном порту. Идеален для интеграционных тестов с TestRestTemplate.
DEFINED_PORT Запускает реальный веб-сервер на порту из конфигурации (server.port), по умолчанию 8080.
NONE Загружает ApplicationContext без какого-либо веб-окружения. Подходит для тестирования сервисов и репозиториев.
Примеры использования
// Мок-окружение (без реального сервера)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
class MockEnvTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void testWithMockMvc() throws Exception {
        mockMvc.perform(get("/api/users"))
               .andExpect(status().isOk());
    }
}

// Реальный сервер на случайном порту
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class RandomPortTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @LocalServerPort
    private int port;

    @Test
    void testWithRealServer() {
        ResponseEntity<String> response =
            restTemplate.getForEntity("/api/users", String.class);
        assertEquals(HttpStatus.OK, response.getStatusCode());
    }
}

// Без веб-окружения
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
class NoWebTest {

    @Autowired
    private UserService userService;

    @Test
    void testServiceOnly() {
        assertNotNull(userService.findAll());
    }
}

На собеседовании: интервьюер хочет услышать, когда какой режим применять. Частая ошибка — не знать разницу между MOCK и RANDOM_PORT и всегда использовать RANDOM_PORT, замедляя тесты.