专栏首页13blog.siteSpring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试

Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试

前言

承接前一篇文章《Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例》,已经讲解了dao层和service层的单元测试,还有控制器这层也不能漏掉,因此本篇会讲一下MockMvc,及controller控制层的单元测试,相关代码已上传,可自行下载。 我的github地址

为什么使用MockMvc?

可能我们在测试控制层的代码都是启动服务器,在浏览器中输入URL,然后开始测试是否达到预期效果,发生错误的话,修改相关代码并重启服务器再次进行测试。分析一下这个过程,启动服务器-->打开浏览器-->输入URL-->等待返回结果-->修复bug-->重启服务器.....循环。 其中的缺点也挺明显的,在浏览器输入URL的地址,如果是GET请求还好,POST请求或者DELETE请求怎么办?只能借助其他工具,通过命令行编写curl语句,或者借助谷歌浏览器的postman插件,亦或者自己在代码中通过编写相应httpClient方法来实现测试,但是这几种方法都较为麻烦,而且测试用例并不能较好的保存。再说一个缺点,代码修改后,往往需要再次重启服务器,等待启动完毕才能接下来的测试过程。 如果tomcat服务器启动速度较慢,这将是一件非常痛苦的事情,测试验证也不方便,且依赖网络环境,这些原因导致测试起来很麻烦,而为了可以方便对Controller进行测试,且很好的保存和循环使用测试用例,则可以通过单元测试来解决,通过前面一篇文章,大家对于单元测试的便利性有了认识和体会,接下来通过引入MockMVC进行控制层的单元测试。 MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。

MockMvc单元测试实例

MockMvc测试过程: 1、创建请求 2、设置参数(这一步其实可以设置很多参数,MockMvc提供了丰富的方法,但是本例中只是简单的参数设置,因为方法都较简单,并没有复杂的调用) 3、mockMvc调用perform,调用controller的业务处理逻辑 4、perform返回ResultActions,返回操作结果,通过ResultActions,提供了统一的验证方式。

测试代码在test包中,也已经传到github上,可以下载到本地运行测试。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration({"classpath*:/applicationContext.xml", "classpath*:/spring-mvc.xml", "classpath*:/mybatis-config.xml"})
public class BookControllerTest {
    @Autowired
    private WebApplicationContext wac;
    private MockMvc mockMvc;
    @Before
    public void setup() {
        this.mockMvc = webAppContextSetup(this.wac).build();
    }
    @Test
    public void testList() throws Exception {
        //创建书籍列表的请求
        //请求方式为get
        MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.get("/book/listAll.do");
        //此请求并不需要添加请求参数 mockMvc.perform(mockHttpServletRequestBuilder).andExpect(status().isOk())
                .andDo(print());

    }
}  
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration({"classpath*:/applicationContext.xml", "classpath*:/spring-mvc.xml", "classpath*:/mybatis-config.xml"})
@TransactionConfiguration(defaultRollback = false)
@Transactional
public class StoreControllerTest {
    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = webAppContextSetup(this.wac).build();
    }

    @Test
    public void testSave() throws Exception {
        //创建书架创建的请求
        //请求方式为post
        MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.post("/store/save.do");
        //添加编号为MockMvc的书架
        mockHttpServletRequestBuilder.param("number", "MockMvc");
        //书架为两层
        mockHttpServletRequestBuilder.param("level", "2");
        mockMvc.perform(mockHttpServletRequestBuilder).andExpect(status().isOk())
                .andDo(print());
    }

    @Test
    public void testList() throws Exception {
        //创建书架创建的请求
        //请求方式为post
        MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.post("/store/list.do");
        //有些参数我注释掉了,你可以自行添加相关参数,得到不同的测试结果
        //status为0的记录
        //mockHttpServletRequestBuilder.param("status", "0");
        //书架编号为dd的记录
        //mockHttpServletRequestBuilder.param("number", "dd");
        //第一页
        mockHttpServletRequestBuilder.param("page", "1");
        //每页10条记录
        mockHttpServletRequestBuilder.param("rows", "10");
        mockMvc.perform(mockHttpServletRequestBuilder).andExpect(status().isOk())
                .andDo(print());
                
    //控制台会打印如下结果:
    //MockHttpServletResponse:
    //Status = 200 即为后端成功相应
    //返回数据
    }
    
}  

总结

如果你还是习惯于启动tomcat服务器,然后在浏览器中输入地址测试的话,也未尝不可,方法在上面,已经写好了,使不使用还是要看个人习惯的。 以上的测试都是针对本项目的简单测试,应该都不是很复杂,很容易上手的,后面如果有复杂的测试的话,再进行深入的讲解,想要深入了解SpringMVC的MockMvc测试的话可以自行搜索相关教程。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载。 简介 这是一篇关于...

    我是十三
  • Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例

    前言 前一篇文章《Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试》讲了不为和不能两个状态,针对不为,只能自己调整心态了,...

    我是十三
  • Spring+SpringMVC+MyBatis+easyUI整合基础篇(三)搭建步骤

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载。 框架介绍 Spring...

    我是十三
  • Android中资源各种引用方式?,@,@*等等

    这几天做系统开发涉及到actionbar的style修改,要从framework层改,不知道?android:attr/是从哪儿引用的属性,给开发带来了很大的困...

    fanfan
  • 新一季《权力的游戏》谁又要挂掉?算法神预测龙妈要去领盒饭了!

    大数据文摘
  • ASP.NET MVC 3发布报错(ASP.NET MVC 3在没有安装环境的服务器上运行)的解决方案

    前言 ASP.NET MVC 3在没有安装MVC3的环境的服务器上运行,就会报错,缺少引用,本文就为mvc3发布报错的解决方案。 解决方案 思路:提供ASP....

    Java中文社群_老王
  • MIT长篇论文:我们热捧的AI翻译和自动驾驶,需要用技术性价比来重估

    只是在过去十年里面,这种计算限制被「淡化」了。人们专注于「算法」优化和「硬件」性能的提升,以及愿意投入更高的「成本」来获得更好的性能。

    量子位
  • 注意了,学习前端开发,可提高Web开发效率的15类工具

    Web的发展日新月异,这也使得Web开发者不得不加快脚步,学习新的技术和编程语言。尤其是对于那些大量流量入口的网站来说,跟上技术发展趋势更是尤为重要。为了使得W...

    用户5827212
  • 自定义Unity对象生命周期管理集成ADO.NET Entity Framework

    在Unity中,从Unity 取得的实例为 Transient。如果你希望使用多线程方式,就需要在组成时使用lifecycle参数,这时候取出的组件就不再是同一...

    张善友
  • Android中关于屏幕的三个小众知识(宽屏适配、禁止截屏和保持屏幕常亮)

    宽屏适配、禁止截屏和保持屏幕常亮,这三个与屏幕有关的 Android 开发小众知识,说不定什么时候就派上用场。

    砸漏

扫码关注云+社区

领取腾讯云代金券