Spring、Spring Boot和TestNG测试指南 ( 6 )

发表于:2017-12-18 11:41

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:chanjarster    来源:ImportNew

  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"));
}
}
  在这段代码里,主要有三个步骤:
  1、将测试类标记为@WebAppConfiguration
  2、通过webAppContextSetup(wac).build()构建MockMvc
  3、利用MockMvc对结果进行判断
  例子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"));
}
}
相关文章

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号