竹笋

注册

 

发新话题 回复该主题

SpringMVC框架如何与Junit整 [复制链接]

1#
白癜风治疗那家医院好 https://baijiahao.baidu.com/s?id=1719927173330035222&wfr=spider&for=pc

您好,我是码农飞哥,感谢您阅读本文!如果此文对您有所帮助,请毫不犹豫的一键三连吧!本文主要介绍在SpringMVC框架整合Junit框架进行单元测试。闲话少述,让我们直入主题。

文章目录

系统环境引入依赖编写单元测试基类代码说明MockMvcRequestBuilders返回结果的content-type是application/json的请求的单元测试get请求测试post请求测试文件上传测试发送一个json格式的数据到Controller层返回结果是视图请求的单元测试直接测试一个service的方法总结

系统环境

引入依赖

dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.1/versionscopetest/scope/dependency      dependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion${spring.version}/versionscopetest/scope/dependency

如上,引入了4个依赖,其中:

junit是Junit单元测试的基础依赖,它提供了

RunWith和

Test等单元测试必备的注解。scopetest/scope则指明了该依赖的作用范围是test阶段。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;

AutowidprivateWebApplicationContextcontext;//获取系统上下文protectedWebApplicationContextgetCtx(){turnthis.context;}  //初始化方法

Befopublicvoidsetup()throwsSQLException{this.mvc=MockMvcBuilders.webAppContextSetup(this.context).build();}  //封装返回结果protectedStringgetMockResultStr(MockHttpServletRequestBuilderquestBuilder){try{MvcResultmvcResult=this.mockMvc.perform(questBuilder).andExpect(status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();MockHttpServletResponsesponse=mvcResult.getResponse();sponse.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);turnsponse.getContentAsString();}catch(Exceptione){e.printStackTrace();turnnull;}}}

代码说明

RunWith(SpringJUnit4ClassRunner.class)注解表明使用SpringJUnit4ClassRunner来运行测试用例。

WebAppConfiguration注解表明使用的ApplicationContext将是WebApplicationContext类型的;value属性指定web应用的根;同时,他必须与

ContextConfiguration一同使用。

ContextConfiguration注解的作用是导入我们需要的配置文件或者类,这里指定了SpringMVC的配置文件

ActiveProfiles注解是指定单元测试连接的环境。

TransactionConfiguration注解是用与管理spring事务的。MockHttpServletRequest类为了模拟HttpServletRequest对象,可以通过它来设置请求头,这在需要鉴权的接口测试中十分实用。MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快,不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。getMockResultStr方法是封装了公共的测试方法以及响应参数。其中:

MvcResultmvcResult=this.mockMvc.perform(questBuilder).andExpect(status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();

perform方法是执行一个RequestBuilder请求,调用Controller的业务处理逻辑。andExpect方法是添加执行完成后的断言,添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确,此处是验证状态是否是00andDo方法是添加一个结果处理器,比如再此处是andDo(MockMvcResultHandlers.print())输出整个响应结果信息,可以在调试的时候使用。andReturn:方法是执行完成后返回相应的结果。

MockMvcRequestBuilders

RequestBuilder是用来构建请求的。其提供了一个方法buildRequest(ServletContextservletContext)用于构建MockHttpServletRequest;其主要有两个子类MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(文件上传时使用),即用来mock客户端请求需要的所有数据,主要API:MockHttpServletRequestBuilderget(StringurlTemplate,Object…urlVariables):根据uri模板和uri变量值得到一个GET请求方式的RequestBuilder,如果在controller的方法中method选择的是RequestMethod.GET,那在controllerTest中对应就要使用MockMvcRequestBuilders.get。post(StringurlTemplate,Object…urlVariables):同get类似,但是是POST方法;通过param方法来设置请求参数。

返回结果的content-type是application/json的请求的单元测试

get请求测试

get请求的测试就是调用MockMvcRequestBuilders的get方法,在该方法中传入接口地址。

MockHttpServletRequestBuilderquestBuilder=MockMvcRequestBuilders.get("/v1/works/lineup/set").param("id","1").param("first_flag",String.valueOf(true));Stringsult=getMockResultStr(questBuilder);

post请求测试

post请求的测试就是调用MockMvcRequestBuilders的post方法,在该方法中传入接口地址。

MockHttpServletRequestBuilderquestBuilder=MockMvcRequestBuilders.post("/v1/blockly/copy").param("id","");success(questBuilder);

文件上传测试

文件上传的测试就是调用MockMvcRequestBuilders的multipart方法,在该方法中传入接口地址。

Filefile=newFile(RestArmWorksControllerTest.class.getClassLoader().getResource(".png").toURI());MockMultipartFilemockMultipartFile=newMockMultipartFile("file",".png","",newFileInputStam(file));MockMultipartHttpServletRequestBuilderservletRequestBuilder=MockMvcRequestBuilders.multipart("/cation/fileUpload.do").file(mockMultipartFile);Stringsult=getMockResultStr(servletRequestBuilder);

发送一个json格式的数据到Controller层

StringquestJson=JSONObject.toJSONString(folderInfo);MockHttpServletRequestBuilderquestBuilder=MockMvcRequestBuilders.post("//v1/works/save").contentType(MediaType.APPLICATION_JSON).content(questJson);

返回结果是视图请求的单元测试

那么,问题来了,如果一个接口的返回结果是视图,那么这个接口的单元测试该如何写呢?比如下面这个接口:

RequestMapping(value="/edit")publicStringedit(ModelMapmodel,HttpServletRequestquest,HttpServletResponsesponse){LongscriptId=null;if(StringUtils.isNotBlank(quest.getParameter("scriptId"))){scriptId=Long.parseLong(quest.getParameter("scriptId"));}if(scriptId!=null){MallSuperscriptmallSuperscript=superScriptService.getScriptById(scriptId);model.addAttribute("superScript",mallSuperscript);}model.addAttribute("scriptTypeMap",ScriptType.toMap());logger.info("角标编辑页面返回成功");turn"manage/superScript/edit";}

这个接口返回的是一个视图,就是名称为edit.jsp页面。它的测试方法可以像下面这样写。

TestpublicvoidtestEdit()throwsException{MvcResultmvcResult=mvc.perform(get("/manage/tab/superScript/edit").sessionAttr("adminid","1").sessionAttr("platformid",L).param("scriptId","1")).andExpect(status().isOk()).andDo(print()).andReturn();assertEquals("manage/superScript/edit",mvcResult.getModelAndView().getViewName());}

通过mvcResult.getModelAndView().getViewName()获取视图的名称。

直接测试一个service的方法

上面的那些测试针对的都是Controller层的接口,那么如果要测试一个service层的方法,该如何处理呢?

publicclassMallMailJobTestextendsBaseControllerTest{privateMallMailJobmallMailJob;

Override

Befopublicvoidsetup()throwsSQLException{super.setup();mallMailJob=getCtx().getBean(MallMailJob.class);}/****

throwsException*/

TestpublicvoidtestExecute()throwsException{mallMailJob.execute();}

被测试的MallMailJob类也可以通过

Autowid注解直接注入进SpringIOC容器中。拿到被测试类的实例之后就可以直接调用被测试的方法,是不是灰常的简单呀。

总结

本文详细介绍在SpringMVC任何使用Junit框架。首先介绍了如何引入依赖,接着介绍了编写一个测试基类,并且对其中涉及的各个注解做了一个详细说明。最后就是罗列了各种测试情况。

,

分享 转发
TOP
发新话题 回复该主题