JUnit测试进阶(Mock测试)

Mock测试

  • 一、Mock测试
    • 1.Mock测试产生背景
    • 2.什么是Mock测试
    • 3.具体案例


一、Mock测试

1.Mock测试产生背景

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


2.什么是Mock测试

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


3.具体案例

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


JUnit测试进阶(Mock测试)_第1张图片
(类Account)


JUnit测试进阶(Mock测试)_第2张图片
(接口Manager)


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


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


JUnit测试进阶(Mock测试)_第3张图片
(服务Service)


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


JUnit测试进阶(Mock测试)_第4张图片
(测试类MockManager)


注:下图是最终测试

JUnit测试进阶(Mock测试)_第5张图片
可以看到最后的测试成功,Mock测试成功!

你可能感兴趣的:(测试,Java基础,junit,java)