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 может помочь вам выполнить полные сквозные тесты с реальным сервером.
Читайте также:
- Spring Boot: тестирование в фиктивной (mock) среде
- Spring Boot: автоматически настроенные JSON тесты
- Spring Boot: автоматически настроенные тесты
Комментарии
Отправить комментарий