springboot使用MockMvc测试controller
通常,在我们平时开发项目时,如果想要输入URL对Controller进行测试,在代码编辑之后,需要重启服务器,建立http client进行测试。这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,这样会导致测试无法进行,为了可以对Controller进行测试,可以通过引入MockMVC进行解决。
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
MockMvcBuilder是用来构造MockMvc的构造器,其主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分别对应两种测试方式,即独立安装和集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。对于我们来说直接使用静态工厂MockMvcBuilders创建即可。
下面就写几个简单的案例,使用MockMvc测试Controller中的get请求和post请求。
1.引入jar包
1 2 3 4 5 | <dependency> <groupId>org.springframework.boot< /groupId > <artifactId>spring-boot-starter- test < /artifactId > <scope> test < /scope > < /dependency > |
2.编写测试controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | /** * @author Sue * @create 2019-09-06 10:03 **/ @RestController @RequestMapping ( "/mock" ) public class MockmvcController { /** * get请求 * @param username * @param password * @return */ @GetMapping ( "/getInfo" ) public R getInfo(String username,String password){ System.out.println( "username:" + username + "," + "password:" + password); return R.ok(); } /** * post请求 * @param username * @param password * @return */ @PostMapping ( "/getInfo2" ) public R getInfo2(String username,String password){ System.out.println( "username:" + username + "," + "password:" + password); return R.ok(); } /** * post请求接收json格式 * @param user * @return */ @PostMapping ( "/getInfo3" ) public R getInfo3( @RequestBody User user){ System.out.println(user); return R.ok(user); } } |
3.创建单元测试
idea使用快捷键ctrl+alt+t
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | @RunWith (SpringRunner. class ) @SpringBootTest public class MockmvcTest { // 注入web环境的ApplicationContext容器 @Autowired private WebApplicationContext context; /** * 模拟mvc测试对象 */ private MockMvc mockMvc; /** * 所有测试方法执行之前执行该方法 */ @Before // 这个注解的作用,在每个方法之前都会执行一遍 public void before() throws Exception { //获取mockmvc对象实例 mockMvc = MockMvcBuilders.webAppContextSetup( this .context).build(); } @Test public void getInfo() throws Exception { MvcResult mvcResult = mockMvc.perform( MockMvcRequestBuilders.get( "/mock/getInfo" ) .param( "username" , "Jack" ) .param( "password" , "Jack001" )) .andExpect(MockMvcResultMatchers.status().isOk()) .andDo(MockMvcResultHandlers.print()).andReturn(); System.out.println( "输出 " + mvcResult.getResponse().getContentAsString()); } @Test public void getInfo2() throws Exception { MvcResult mvcResult = mockMvc.perform( MockMvcRequestBuilders.post( "/mock/getInfo2" ) .accept(MediaType.APPLICATION_JSON) .param( "username" , "Jack" ) .param( "password" , "Jack001" )) .andExpect(MockMvcResultMatchers.status().isOk()) .andDo(MockMvcResultHandlers.print()).andReturn(); System.out.println( "输出 " + mvcResult.getResponse().getContentAsString()); } @Test public void getInfo3() throws Exception { User user = new User(); user.setUsername( "Jack" ); user.setPassword( "Jack001" ); String jsonString = JSON.toJSONString(user); MvcResult mvcResult = mockMvc.perform( MockMvcRequestBuilders.post( "/mock/getInfo3" ) .contentType(MediaType.APPLICATION_JSON) .content(jsonString) .accept(MediaType.APPLICATION_JSON) ) .andExpect(MockMvcResultMatchers.status().isOk()) .andDo(MockMvcResultHandlers.print()).andReturn(); int status = mvcResult.getResponse().getStatus(); Assert.assertTrue( "正确" , status == 200 ); System.out.println( "输出 " + mvcResult.getResponse().getContentAsString()); } } |
4.测试
代码解析 :
perform
:执行一个RequestBuider
请求,自动执行SpringMvc
的流程并映射到相应的控制器执行处理get
: 声明一个发送get
请求的方法.public static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars) { return new MockHttpServletRequestBuilder(HttpMethod.GET, urlTemplate, uriVars);}
这是个静态方法,可以直接导入,根据uri模版和uri的变量值得到一个get
请求的方法. 另外提供了其他的请求方法, 如:post
、put
、delete
等.andExperct
: 添加ResultMatcher
验证规则,验证perform
执行完成后的结果是否正确(对返回的数据进行判断)andDo
: 添加ResultHandler
结果处理器,比如调试打印结果到控制台print()
andReturn
: 最后返回相应的MvcResult
,然后进行自定义验证/进行下一步的异步处理.
整个测试过程如下:
1、准备测试环境
2、通过MockMvc执行请求
3、添加验证断言
4、添加结果处理器
5、得到MvcResult进行自定义断言/进行下一步的异步请求
6、卸载测试环境
通过这几个方法,相信大家对mockMvc测试有了一些了解,如果想要使用更多细节,通过方法名和参数应该也能看懂方法含义,如果还是不能理解,可以查看下面的官方文档配合使用。
本博客文章均已测试验证,欢迎评论、交流、点赞。
部分文章来源于网络,如有侵权请联系删除。
转载请注明原文链接:https://www.cnblogs.com/sueyyyy/p/11534047.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2018-09-17 Quartz基础+实例