Spring Testing Framework提供了Spring MVC Test Framework,可以或许很利便的来测试Controller。同时Spring Boot也提供了Auto-configured Spring MVC tests更进一步简化了测试需要的设置事情。
本章节将别离举例说明在不利用Spring Boot和利用Spring Boot下如何对Spring MVC举办测试。
例子1:Spring
测试Spring MVC的要害是利用MockMvc工具,操作它我们可以或许在不需启动Servlet容器的环境下测试Controller的行为。
源代码SpringMvc_1_Test.java:
@EnableWebMvc @WebAppConfiguration @ContextConfiguration(classes = { FooController.class, FooImpl.class }) public class SpringMvc_1_Test extends AbstractTestNGSpringContextTests { @Autowired private WebApplicationContext wac; private MockMvc mvc; @BeforeMethod public void prepareMockMvc() { this.mvc = webAppContextSetup(wac).build(); } @Test public void testController() throws Exception { this.mvc.perform(get("/foo/check-code-dup").param("code", "123")) .andDo(print()) .andExpect(status().isOk()) .andExpect(content().string("true")); } }
在这段代码里,主要有三个步调:
例子2:Spring + Mock
在例子1里,FooController利用了一个实体FooImpl的Bean,实际上我们也可以提供一个Foo的mock bean来做测试,劳务派遣管理系统,这样就可以或许更多的节制测试进程。假如你还不知道Mock那么请看Spring、Spring Boot 和 TestNG 测试指南 ( 4 )。
源代码SpringMvc_2_Test.java:
@EnableWebMvc @WebAppConfiguration @ContextConfiguration(classes = { FooController.class }) @TestExecutionListeners(listeners = MockitoTestExecutionListener.class) public class SpringMvc_2_Test extends AbstractTestNGSpringContextTests { @Autowired private WebApplicationContext wac; @MockBean private Foo foo; private MockMvc mvc; @BeforeMethod public void prepareMockMvc() { this.mvc = webAppContextSetup(wac).build(); } @Test public void testController() throws Exception { when(foo.checkCodeDuplicate(anyString())).thenReturn(true); this.mvc.perform(get("/foo/check-code-dup").param("code", "123")) .andDo(print()) .andExpect(status().isOk()) .andExpect(content().string("true")); } }
例子3:Spring Boot
Spring Boot提供了@WebMvcTest更进一步简化了对付Spring MVC的测试,我们提供了对应例子1的Spring Boot版本。
源代码BootMvc_1_Test.java:
@WebMvcTest @ContextConfiguration(classes = { FooController.class, FooImpl.class }) public class BootMvc_1_Test extends AbstractTestNGSpringContextTests { @Autowired private MockMvc mvc; @Test public void testController() throws Exception { this.mvc.perform(get("/foo/check-code-dup").param("code", "123")) .andDo(print()) .andExpect(status().isOk()) .andExpect(content().string("true")); } }
在这里,劳务派遣管理系统,昆山软件开发,我们不需要本身构建MockMvc,直接利用@Autowired注入就行了,是不是很利便?
例子4:Spring Boot + Mock
这个是对应例子2的Spring Boot版本,源代码BootMvc_2_Test.java:
@WebMvcTest @ContextConfiguration(classes = { FooController.class }) @TestExecutionListeners(listeners = MockitoTestExecutionListener.class) public class BootMvc_2_Test extends AbstractTestNGSpringContextTests { @Autowired private MockMvc mvc; @MockBean private Foo foo; @Test public void testController() throws Exception { when(foo.checkCodeDuplicate(anyString())).thenReturn(true); this.mvc.perform(get("/foo/check-code-dup").param("code", "123")) .andDo(print()) .andExpect(status().isOk()) .andExpect(content().string("true")); } }
参考文档