Spring MVC Test
来源:原创 发布时间:2015-04-22 归档:spring-test
开发环境 :
JDK 7
Maven 3
Tomcat 7
Junit 4.11
Spring 4.1.5
MySQL 5.5
Eclipse Luna
Controller
@Controller @RequestMapping("/employee") public class EmployeeController { @Autowired private EmployeeDao employeeDao; private static final String PAGE_RESULT = "home"; @RequestMapping(value = "/list", method = GET) public String list(ModelMap model) { List<Employee> list = employeeDao.getAll(); model.put("employeeList", list); return PAGE_RESULT; } @RequestMapping(value = "/save", method = GET) public String save(ModelMap model, Employee employee) { boolean result = employeeDao.save(employee); model.put("success", result); return PAGE_RESULT; } @RequestMapping(value = "/info/{employeeId:[1-9]\\d*}", method = GET) public String info(ModelMap model, @PathVariable Integer employeeId) { Employee employee = employeeDao.queryById(employeeId); model.put("employee", employee); return PAGE_RESULT; } @RequestMapping(value = "/json/save", method = POST) public @ResponseBody boolean save(@RequestBody Employee employee) { boolean result = employeeDao.save(employee); return result; } @RequestMapping(value = "/json/info/{employeeId:[1-9]\\d*}", method = POST) public @ResponseBody Employee info(@PathVariable Integer employeeId) { Employee employee = employeeDao.queryById(employeeId); return employee; } }普通处理方法测试
import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.lychie.model.Employee; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.transaction.TransactionConfiguration; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.context.WebApplicationContext; import static org.hamcrest.Matchers.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @RunWith(SpringJUnit4ClassRunner.class) @Transactional @TransactionConfiguration(defaultRollback = false) @WebAppConfiguration @ContextConfiguration({"/spring-context.xml", "/spring-mvc.xml"}) public class EmployeeControllerTest { private MockMvc mockMvc; @Autowired private WebApplicationContext context; @Before public void setUp() { mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); } @Test public void testList() throws Exception { mockMvc.perform(get("/employee/list")) .andExpect(handler().methodName("list")) .andExpect(status().isOk()) .andExpect(view().name("home")) .andExpect(forwardedUrl("/WEB-INF/pages/home.jsp")) .andExpect(model().attribute("employeeList", allOf( not(nullValue()), hasSize(greaterThan(0)) ))).andDo(print()); } }
@WebAppConfiguration 用于声明为集成测试环境加载的 ApplicationContext 是一个 WebApplicationContext 类型。
@WebAppConfiguration 标注的 value 注解用于指定 web 应用的根路径, 默认是 @WebAppConfiguration("src/main/webapp")。
@WebAppConfiguration 注解需要 @ContextConfiguration 的支持。其余注解可参考本站点 junit 和 spring-test 相关文章。
MockMvc 有两种构建方式 :
1.MockMvcBuilders.webAppContextSetup(WebApplicationContext context), 从上下文环境中获取控制器以构建 MockMvc
2.MockMvcBuilders.standaloneSetup(Object... controllers), 通过指定的控制器来构建 MockMvc
测试流程大致为 :
MockMvc.perform, 执行一个请求
MockMvcRequestBuilders.get 构造一个请求
ResultActions.andExpect 结果断言
ResultActions.andDo 结果处理
@WebAppConfiguration 标注的 value 注解用于指定 web 应用的根路径, 默认是 @WebAppConfiguration("src/main/webapp")。
@WebAppConfiguration 注解需要 @ContextConfiguration 的支持。其余注解可参考本站点 junit 和 spring-test 相关文章。
MockMvc 有两种构建方式 :
1.MockMvcBuilders.webAppContextSetup(WebApplicationContext context), 从上下文环境中获取控制器以构建 MockMvc
2.MockMvcBuilders.standaloneSetup(Object... controllers), 通过指定的控制器来构建 MockMvc
测试流程大致为 :
MockMvc.perform, 执行一个请求
MockMvcRequestBuilders.get 构造一个请求
ResultActions.andExpect 结果断言
ResultActions.andDo 结果处理
执行测试, 结果如下 :
测试绑定参数到处理方法
@Test public void testSave() throws Exception { mockMvc.perform(get("/employee/save") .param("name", "店小四") .param("age", "20") .param("mail", "dianxiaosi@yeah.net")) .andExpect(handler().methodName("save")) .andExpect(status().isOk()) .andExpect(view().name("home")) .andExpect(forwardedUrl("/WEB-INF/pages/home.jsp")) .andExpect(model().attribute("success", is(true))) .andDo(print()); }
通过 param(String, String...) 来传参到处理方法, 执行测试, 结果如下 :
测试绑定参数到URL模板
@Test public void testInfo() throws Exception { mockMvc.perform(get("/employee/info/{employeeId:[1-9]\\d*}", 2)) .andExpect(handler().methodName("info")) .andExpect(status().isOk()) .andExpect(forwardedUrl("/WEB-INF/pages/home.jsp")) .andExpect(model().attribute("employee",allOf( not(nullValue()), isA(Employee.class) ))).andDo(print()); }
通过 get(String urlTemplate, Object... urlVariables) 绑定参数到URL模板, 执行测试, 结果如下 :
测试绑定JSON参数到处理方法
@Test public void testJsonSave() throws Exception { String employee = "{\"id\":null,\"age\":18,\"name\":\"店小六\",\"mail\":\"dianxiaoliu@163.com\"}"; mockMvc.perform(post("/employee/json/save").contentType("application/json").content(employee)) .andExpect(handler().methodName("save")) .andExpect(status().isOk()) .andExpect(jsonPath("$").value(true)) .andDo(print()); }
通过 content(String) 绑定JSONG参数到处理方法, jsonPath 用法参考 http://goessner.net/articles/JsonPath, 执行测试, 结果如下 :
测试返回JSON数据的处理方法
@Test public void testJsonInfo() throws Exception { mockMvc.perform(post("/employee/json/info/{employeeId:[1-9]\\d*}", "2").accept("application/json")) .andExpect(handler().methodName("info")) .andExpect(status().isOk()) .andExpect(jsonPath("$.id").value(2)) .andDo(print()); }
jsonPath 用法参考 http://goessner.net/articles/JsonPath, 执行测试, 结果如下 :
示例代码下载