Spring Boot: автоматически настроенные Spring MVC тесты

Чтобы проверить работоспособность контроллеров Spring MVC, используйте аннотацию @WebMvcTest. @WebMvcTest автоматически настраивает инфраструктуру Spring MVC и ограничивает отсканированные bean-компоненты до @Controller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, Filter, HandlerInterceptor, WebMvcConfigurer и HandlerMethodArgumentResolver. Обычные компоненты @Component не сканируются при использовании этой аннотации.

Если вам нужно зарегистрировать дополнительные компоненты, такие как Jackson Module, вы можете импортировать дополнительные классы конфигурации, используя @Import в своем тесте.

Часто @WebMvcTest ограничивается одним контроллером и используется в сочетании с @MockBean для предоставления mock реализаций для необходимых компонентов.

@WebMvcTest также автоматически настраивает MockMvc. Mock MVC предлагает мощный способ быстрого тестирования контроллеров MVC без необходимости запуска полноценного HTTP-сервера.

Вы также можете автоматически настроить MockMvc в не-WebMvcTest (например, @SpringBootTest), пометив его @AutoConfigureMockMvc. В следующем примере используется MockMvc:

import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.*;
import org.springframework.boot.test.autoconfigure.web.servlet.*;
import org.springframework.boot.test.mock.mockito.*;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.BDDMockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@WebMvcTest(UserVehicleController.class)
class MyControllerTests {

    @Autowired
    private MockMvc mvc;

    @MockBean
    private UserVehicleService userVehicleService;

    @Test
    void testExample() throws Exception {
        given(this.userVehicleService.getVehicleDetails("sboot"))
                .willReturn(new VehicleDetails("Honda", "Civic"));
        this.mvc.perform(get("/sboot/vehicle").accept(MediaType.TEXT_PLAIN))
                .andExpect(status().isOk()).andExpect(content().string("Honda Civic"));
    }

}

Если вам нужно настроить элементы автоконфигурации (например, когда должны применяться фильтры сервлетов), вы можете использовать атрибуты в аннотации @AutoConfigureMockMvc.

Если вы используете HtmlUnit или Selenium, автоконфигурация также предоставляет компонент HtmlUnit WebClient и/или компонент Selenium WebDriver. В следующем примере используется HtmlUnit:

import com.gargoylesoftware.htmlunit.*;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.*;
import org.springframework.boot.test.autoconfigure.web.servlet.*;
import org.springframework.boot.test.mock.mockito.*;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.BDDMockito.*;

@WebMvcTest(UserVehicleController.class)
class MyHtmlUnitTests {

    @Autowired
    private WebClient webClient;

    @MockBean
    private UserVehicleService userVehicleService;

    @Test
    void testExample() throws Exception {
        given(this.userVehicleService.getVehicleDetails("sboot"))
                .willReturn(new VehicleDetails("Honda", "Civic"));
        HtmlPage page = this.webClient.getPage("/sboot/vehicle.html");
        assertThat(page.getBody().getTextContent()).isEqualTo("Honda Civic");
    }

}

По умолчанию Spring Boot помещает bean-компоненты WebDriver в специальную «область видимости» (“scope”), чтобы гарантировать, что драйвер завершает работу после каждого теста и вводится новый экземпляр. Если вам не нужно это поведение, вы можете добавить @Scope("singleton") в определение WebDriver @Bean.

Область webDriver, созданная Spring Boot, заменит любую определенную пользователем область с тем же именем. Если вы определите свою собственную область действия webDriver, вы можете обнаружить, что она перестает работать при использовании @WebMvcTest.

Если у вас есть Spring Security на пути к классам, @WebMvcTest также будет сканировать bean-компоненты WebSecurityConfigurer. Вместо полного отключения безопасности для таких тестов вы можете использовать тестовую поддержку Spring Security.

Иногда написание Spring MVC тестов недостаточно; Spring Boot может помочь вам выполнить полные сквозные тесты с реальным сервером.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки