本篇文章为大家展示了Spring MVC应用如何进行测试,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
春季的依赖注入使得我们的代码非常容易进行单元测试——<代码> @ Controller 代码>,<代码> @ Service 代码>,<代码> @ entity> 代码等注解标注的类基本都是POJO(传统的普通Java对象),也就是说很少依赖于春容器本身的API。我们可以非常容易地使用JUnit或TestNG编写测试代码。另一方面,对于三层架构的Spring Web应用(控制器、服务刀),使用模拟活存根方法也能够更好的来测试我们的代码逻辑,例如服务层代码的单元测试中,依赖的刀(或仓库)对象都是根据应用测试需求模拟出来的,而不需要真正去访问数据库。
<强> Spring Web测试强>
在对Spring Web应用中的<代码> @ Controller 代码>代码进行单元测试的过程中,一般的方法是创建<代码> @ Controller> 代码对象,同时将它依赖的一些模拟对象,例如MockHttpServletRequest, MockHttpServletResponse(都由Spring测试模块提供,无需自己编写)作为@ Controller方法的参数。但是对于处理Web请求的@ Controller代码来说,仅仅测试处理方法里的代码是远远不够的,对于一个处理HTTP请求的@ Controller”,我们还需要测试:
- <李> <代码> @RequestMapping 代码>路由是否正确李> <>李数据绑定,类型转换,校验逻辑是否正确——数据包括URL参数,表单,<代码> @PathVariable> 代码等李> <李> <代码> @InitBinder 代码>,<代码> @ModelAttribute 代码>,<代码> @ExceptionHandler> 代码等注解的方法或属性计算过程李>
上述过程贯穿于HTTP请求处理的生命周期中,所以对Spring Web应于用中<代码> @ Controller 代码>代码单元测试的概念,应该做一些扩充,不仅仅局限于代码本身,也要结合MVC框架中的各个处理过程。
本文接下来的内容代码,都以弹簧引导为例,首先假设我们通过弹簧引导创建了一个最简单的Web MVC应用,包含了一个最简单的控制方法,处理<代码>/用户/{id} 代码>对应的HTTP请求,返回值是<代码> id={id}> 代码(通过<代码> String.format() 代码>方法),那么可以为它创建如下测试代码:
进口静态org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 进口静态org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; 进口静态org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(类=SpringMvcTestDemoApplication.class) @WebAppConfiguration 公开课SpringMvcTestDemoApplicationTests { 私人MockMvc MockMvc; @Before 公共空间init () { 这一点。mockMvc=MockMvcBuilders。standaloneSetup(新用户控件()).build (); } @Test 公共空间getUserById()抛出异常{ 长id=1; this.mockMvc.perform (get(“/用户/?+ id)) .isOk .andExpect(状态()()) .andExpect(内容().string (id=?+ id)); } }
运行上述测试时,很容易从控制台中的日志发现,<代码> SpringJUnit4ClassRunner 代码>创建了一个Spring Web应用上下文,并且在其中进行了Web Mvc框架的配置——这里是注册<代码> @RequestMapping 代码>方法。接下来<代码> mockMvc.perform() 代码>方法实际上向该Spring Web应用发起了一个HTTP请求:
- <李>请求的url为<代码>/用户/{id} 代码> 李> <李> <代码>一下动身()代码>方法也就是测试中常用的<代码>断言代码> 李> <李> <代码>状态()代码>用于检查返回状态吗,这里是200 李> <李> <代码>内容()代码>用于检查内容
李,>
如果我们不小心将<代码> @RequestMapping> 代码的路由路径写错,那么这里运行的结果一定不会是<代码>状态().isOk()> 代码,这也就完成了对HTTP请求路由的测试。接下来我们将继续探索MVC框架中的其他方面。
<强>模拟服务强>
在Spring Web应用三层结构里,控制器层代码通常会调用服务层代码,例如:
@RestController 公开课用户控件{ @ autowired 私人UserService UserService; @RequestMapping (value=https://www.yisu.com/zixun//用户/{id},方法=得到) 公共字符串(@PathVariable (" id ") id) { 字符串的用户名=userService.getUsername (id); 返回字符串。格式(“用户名=% s”,用户名); } }
对<代码>用户控件代码>进行单元测试需要排除服务代码的影响,所以需要对服务进行模拟,这里我们使用5框架,在弹簧上下文中模拟一个