40.3.7 自动配置的Spring MVC测试

你可以使用@WebMvcTest检测Spring MVC控制器是否工作正常,该注解将自动配置Spring MVC设施,并且只扫描注解@Controller@ControllerAdvice@JsonComponentFilterWebMvcConfigurerHandlerMethodArgumentResolver的beans,其他常规的@Component beans将不会被扫描。

通常@WebMvcTest只限于单个控制器(controller)使用,并结合@MockBean以提供需要的协作者(collaborators)的mock实现。@WebMvcTest也会自动配置MockMvc,Mock MVC为快速测试MVC控制器提供了一种强大的方式,并且不需要启动一个完整的HTTP服务器。

使用@AutoConfigureMockMvc注解一个non-@WebMvcTest的类(比如SpringBootTest)也可以自动配置MockMvc

  1. import org.junit.*;
  2. import org.junit.runner.*;
  3. import org.springframework.beans.factory.annotation.*;
  4. import org.springframework.boot.test.autoconfigure.web.servlet.*;
  5. import org.springframework.boot.test.mock.mockito.*;
  6. import static org.assertj.core.api.Assertions.*;
  7. import static org.mockito.BDDMockito.*;
  8. import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
  9. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
  10. @RunWith(SpringRunner.class)
  11. @WebMvcTest(UserVehicleController.class)
  12. public class MyControllerTests {
  13. @Autowired
  14. private MockMvc mvc;
  15. @MockBean
  16. private UserVehicleService userVehicleService;
  17. @Test
  18. public void testExample() throws Exception {
  19. given(this.userVehicleService.getVehicleDetails("sboot"))
  20. .willReturn(new VehicleDetails("Honda", "Civic"));
  21. this.mvc.perform(get("/sboot/vehicle").accept(MediaType.TEXT_PLAIN))
  22. .andExpect(status().isOk()).andExpect(content().string("Honda Civic"));
  23. }
  24. }

如果需要定义自定配置(auto-configuration)的元素(比如什么时候使用servlet filters),你可以使用@AutoConfigureMockMvc的属性。

如果你使用HtmlUnit或Selenium, 自动配置将提供一个WebClient bean和/或WebDriver bean,以下是使用HtmlUnit的示例:

  1. import com.gargoylesoftware.htmlunit.*;
  2. import org.junit.*;
  3. import org.junit.runner.*;
  4. import org.springframework.beans.factory.annotation.*;
  5. import org.springframework.boot.test.autoconfigure.web.servlet.*;
  6. import org.springframework.boot.test.mock.mockito.*;
  7. import static org.assertj.core.api.Assertions.*;
  8. import static org.mockito.BDDMockito.*;
  9. @RunWith(SpringRunner.class)
  10. @WebMvcTest(UserVehicleController.class)
  11. public class MyHtmlUnitTests {
  12. @Autowired
  13. private WebClient webClient;
  14. @MockBean
  15. private UserVehicleService userVehicleService;
  16. @Test
  17. public void testExample() throws Exception {
  18. given(this.userVehicleService.getVehicleDetails("sboot"))
  19. .willReturn(new VehicleDetails("Honda", "Civic"));
  20. HtmlPage page = this.webClient.getPage("/sboot/vehicle.html");
  21. assertThat(page.getBody().getTextContent()).isEqualTo("Honda Civic");
  22. }
  23. }

附录中可以查看@WebMvcTest开启的自动配置列表。