• JUnit测试进阶(Mock测试)



    一、Mock测试

    1.Mock测试产生背景

    一个应用程序通常由多个类文件组成,各个类之间彼此存在着继承,实现,关联,依赖等关系,共同为用户服务。应用中单个类文件通常不能看作一个单独的个体,它可能被某个类使用,也可能使用其他类。因此,要想对应用开展充分的测试,应当充分考虑每个类的上下文环境。然而,在应用开发时其所以依赖的功能和模块总是不完整的。例如,应用程序需要通过HTTP连接获得第三方服务器或数据库提供的服务,但在开发初期尚不存在可用的服务器或数据库,此时需要相应的功能模拟。又如,某个开发者所负责的模块功能依赖于其他开发者尚未完成的模块,在测试也需要模拟这些模块的功能。对于上述情形,开发者需要通过Mock测试来保证测试的有效性


    2.什么是Mock测试

    Mock测试在对程序模块进行测试时,通过替换与待测方法协作的对象,来实现待测代码与其他代码的隔离。值得注意的是,Mock只为测试提供服务,因此替换模块并不需要实现任何程序逻辑,只提供一个用于模仿被替换方法的空客


    3.具体案例

    下面以类Account,Manager和Service 为例说明Mock的测试方法,如图1和图2所示。其中Account表示账户,Manager负责将数据持久化到数据库,Service提供账户相关的服务(其transfer方法负责转账功能)。由于Service类涉及了账目金额的相关管理,因此需要为其建立一个数据库并预先加入测试数据。在上线运行时,对Service进行测试是非常方便的,然而在单元测试时,为其单独建一个数据库,设计测试数据便显得比较复杂,对此。可以用Mock对象来模拟所需的功能和数据,提高单元测试效率


    图1
    (类Account)


    在这里插入图片描述
    (接口Manager)


    以Service的方法为例,该方法实现了转款人sender 对收款人beneficiary的转账功能,具体转账操作则是通过Manager完成:首先,根据转款人和收款人的ID获取他们的账户,其次,根据转款金额对转款人的账户金额运行自减操作,对收款人的账户余额进行自增操作;最后,更新收款人和转款人的数据库信息,从而实现转账操作。可以看到,负责与数据库交互的Manager类是整个程序的关键


    对transfer方法进行测试时,一方面需要实现Manager接口,与Service提高服务,另一方面,在实现Manager接口的同时也需要构建数据库,并于数据库建立连接,然而,为了测试transfer方法而实现Manager接口,构建数据库是十分复杂的,对此,可通过Mock测试来模拟Manager的功能,只须满足transfer所需的功能即可。此外,通过Mock测试还可以实现transfer与Manager的隔离,使测试者更关注于transfer中的缺陷


    在这里插入图片描述
    (服务Service)


    下图给出了测试类MockManager和ServiceTest。其中,MockManager并未真正与数据库建立连接,而是实现了Service所需的功能(包括addAccount,findAccountForUser,
    updateAccount等功能),也因而实现Manager 与Service的隔离


    在这里插入图片描述
    (测试类MockManager)


    注:下图是最终测试

    在这里插入图片描述
    可以看到最后的测试成功,Mock测试成功!

  • 相关阅读:
    Jenkins部署springboot项目至远程服务器
    kubernetes-Pod详解2
    Mysql架构 MMM与MHA区别
    前端框架中的路由(Routing)和前端导航(Front-End Navigation)
    【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署
    亚马逊卖家必看:测评补单提升店铺排名和转化率的有效方式
    记一次 Oracle 下的 SQL 优化过程
    Spring 源码阅读 74:事务管理的原理 - BeanFactoryTransactionAttributeSourceAdvisor 分析
    【Leetcode】 100. 相同的树
    简单介绍动态链接过程
  • 原文地址:https://blog.csdn.net/haobabiu/article/details/132945030