




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SpringMVC框架整合Junit进⾏单元测试(案例详解)本⽂主要介绍在SpringMVC框架整合Junit框架进⾏单元测试。闲话少述,让我们直⼊主题。系统环境软件版本spring-webmvc4.3.6.RELEASEspring-test4.3.6.RELEASEjunit4.12引⼊依赖<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version><scope>test</scope></dependency>如上,引⼊了4个依赖,其中:1.junit是Junit单元测试的基础依赖,它提供了@RunWith和@Test等单元测试必备的注解。<scope>test</scope>则指明了该依赖的作⽤范围是test阶段。2.spring-test依赖可以理解成是spring框架与junit框架的桥梁。提供了@WebAppConfiguration等注解。编写单元测试基类@RunWith(SpringJUnit4ClassRunner.class)@WebAppConfiguration@ContextConfiguration("file:src/test/java/spring-config.xml")@ActiveProfiles("dev")@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=true)publicabstractclassBaseControllerTest{protectedMockMvcmvc;@AutowiredprivateWebApplicationContextcontext;//获取系统上下⽂protectedWebApplicationContextgetCtx(){returnthis.context;}//初始化⽅法@Beforepublicvoidsetup()throwsSQLException{this.mvc=MockMvcBuilders.webAppContextSetup(this.context).build();}//封装返回结果protectedStringgetMockResultStr(MockHttpServletRequestBuilderrequestBuilder){try{MvcResultmvcResult=this.mockMvc.perform(requestBuilder).andExpect(status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();MockHttpServletResponseresponse=mvcResult.getResponse();response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);returnresponse.getContentAsString();}catch(Exceptione){e.printStackTrace();returnnull;}}}代码说明1.@RunWith(SpringJUnit4ClassRunner.class)注解表明使⽤SpringJUnit4ClassRunner来运⾏测试⽤例。2.@WebAppConfiguration注解表明使⽤的ApplicationContext将是WebApplicationContext类型的;value属性指定web应⽤的根;同时,他必须与@ContextConfiguration⼀同使⽤。3.@ContextConfiguration注解的作⽤是导⼊我们需要的配置⽂件或者类,这⾥指定了SpringMVC的配置⽂件4.@ActiveProfiles注解是指定单元测试连接的环境。5.@TransactionConfiguration注解是⽤与管理spring事务的。6.MockHttpServletRequest类为了模拟HttpServletRequest对象,可以通过它来设置请求头,这在需要鉴权的接⼝测试中⼗分实⽤。7.MockMvc实现了对Http请求的模拟,能够直接使⽤⽹络的形式,转换到Controller的调⽤,这样可以使得测试速度快,不依赖⽹络环境,⽽且提供了⼀套验证的⼯具,这样可以使得请求的验证统⼀⽽且很⽅便。getMockResultStr⽅法是封装了公共的测试⽅法以及响应参数。其中:MvcResultmvcResult=this.mockMvc.perform(requestBuilder).andExpect(status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();1.perform⽅法是执⾏⼀个RequestBuilder请求,调⽤Controller的业务处理逻辑。2.andExpect⽅法是添加执⾏完成后的断⾔,添加ResultMatcher验证规则,验证控制器执⾏完成后结果是否正确,此处是验证状态是否是2003.andDo⽅法是添加⼀个结果处理器,⽐如再此处是andDo(MockMvcResultHandlers.print())输出整个响应结果信息,可以在调试的时候使⽤。4.andReturn:⽅法是执⾏完成后返回相应的结果。MockMvcRequestBuildersRequestBuilder是⽤来构建请求的。其提供了⼀个⽅法buildRequest(ServletContextservletContext)⽤于构建MockHttpServletRequest;其主要有两个⼦类MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(⽂件上传时使⽤),即⽤来mock客户端请求需要的所有数据。主要API有MockHttpServletRequestBuilder.get(StringurlTemplate,Object…urlVariables):根据uri模板和uri变量值得到⼀个GET请求⽅式的RequestBuilder,如果在controller的⽅法中method选择的是RequestMethod.GET,那在controllerTest中对应就要使⽤MockMvcRequestBuilders.get。MockHttpServletRequestBuilder.post(StringurlTemplate,Object…urlVariables):同get类似,但是是post⽅法,通过param⽅法来设置请求参数。返回结果的content-type是application/json的请求的单元测试get请求测试get请求的测试就是调⽤MockMvcRequestBuilders的get⽅法,在该⽅法中传⼊接⼝地址。MockHttpServletRequestBuilderrequestBuilder=MockMvcRequestBuilders.get("/v1/works/lineup/set").param("id","123").param("first_flag",String.valueOf(true));Stringresult=getMockResultStr(requestBuilder);post请求测试post请求的测试就是调⽤MockMvcRequestBuilders的post⽅法,在该⽅法中传⼊接⼝地址。MockHttpServletRequestBuilderrequestBuilder=MockMvcRequestBuilders.post("/v1/blockly/copy").param("id","1211");success(requestBuilder);⽂件上传测试⽂件上传的测试就是调⽤MockMvcRequestBuilders的multipart⽅法,在该⽅法中传⼊接⼝地址。Filefile=newFile(RestArmWorksControllerTest.class.getClassLoader().getResource("20201102172053.png").toURI());MockMultipartFilemockMultipartFile=newMockMultipartFile("file","20201102172053.png","",newFileInputStream(file));MockMultipartHttpServletRequestBuilderservletRequestBuilder=MockMvcRequestBuilders.multipart("/creation/fileUpload.do").file(mockMultipartFile);Stringresult=getMockResultStr(servletRequestBuilder);发送⼀个json格式的数据到Controller层StringrequestJson=JSONObject.toJSONString(folderInfo);MockHttpServletRequestBuilderrequestBuilder=MockMvcRequestBuilders.post("//v1/works/save").contentType(MediaType.APPLICATION_JSON).content(requestJson);返回结果是视图请求的单元测试那么,问题来了,如果⼀个接⼝的返回结果是视图,那么这个接⼝的单元测试该如何写呢?⽐如下⾯这个接⼝:@RequestMapping(value="/edit")publicStringedit(ModelMapmodel,HttpServletRequestrequest,HttpServletResponseresponse){LongscriptId=null;if(StringUtils.isNotBlank(request.getParameter("scriptId"))){scriptId=Long.parseLong(request.getParameter("scriptId"));}if(scriptId!=null){MallSuperscriptmallSuperscript=superScriptService.getScriptById(scriptId);model.addAttribute("superScript",mallSuperscript);}model.addAttribute("scriptTypeMap",ScriptType.toMap());("⾓标编辑页⾯返回成功");return"manage/superScript/edit";}这个接⼝返回的是⼀个视图,就是名称为edit.jsp页⾯。它的测试⽅法可以像下⾯这样写。@TestpublicvoidtestEdit()throwsException{MvcResultmvcResult=mvc.perform(get("/manage/tab2/superScript/edit").sessionAttr("adminid","1111").sessionAttr("platformid",1001L).param("scriptId","1111")).andExpect(status().isOk()).andDo(print()).andReturn();assertEquals("manage/superScript/edit",mvcResult.getModelAndView().getViewName());}通过mvcResult.getModelAndView().getViewName()获取视图的名称。直接测试⼀个service的⽅法上⾯的那些测试针对的都是Controller层的接⼝,那么如果要测试⼀个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度高端酒店集团战略投资者股权引入及风险管理体系合作协议
- 2025年生态环保特色小镇场地开发与运营管理服务合同
- 2025年乡村旅游资源开发与乡村振兴战略实施合作合同
- 2025年企业内部数据安全防护体系建设项目合同
- 2025年现代农业科技创新推广合作协议模板
- 汽车服务礼仪培训课件
- 商业上班试用期合同
- 吉林公务员面试题及答案
- 高中英语状语从句公开课复习
- 会计兼职劳动合同范本
- 税务会计与税收筹划课件
- 城市照明设计案例赏析
- 2025年高考生物辽宁卷真题解读及复习备考指导(黑龙江吉林内蒙古适用)
- 新媒体视听节目制作
- 数字化教学环境下小学语文板书设计优化策略
- JG/T 237-2008混凝土试模
- JG/T 232-2008卫浴型散热器
- 灭火员初级习题库
- T/CAQP 001-2017汽车零部件质量追溯体系规范
- 燃气入户可行性报告
- 技术赋能医疗创新-深入解析数字化口腔诊所建设指南
评论
0/150
提交评论