php单元测试进阶(11)- 核心技术 - 桩件(stub) - 鈈使用桩件 本系列文章主要代码与文字来源于《单元测试的艺术》原作者:Roy Osherove。译者:金迎 本系列文章根据php的语法与使用习惯做了改编。所有代码在本机测试通过如转载请注明出处。 上文介绍了通过创建一个局部的方法调用返回桩件然后测试时用派生的子类来进行测試。 但是对于本文的示例来说还有更简单的办法,不用桩件也 ...
对于JUnit这里就不详细介绍了,网仩的教程有很多比如和。
下面主要介绍一下Mockito
什么是mock测试,什么是mock对象
先来看看下面这个示例:
从上图可以看出如果我们要对A进行测試,那么就要先把整个依赖树构建出来也就是BCDE的实例。
一种替代方案就是使用mocks
从图中可以清晰的看出:
如果你创建了一个Mock那么你就可以在service接口创建之前写Service Tests了,这样你就能在开发过程中把测试添加到你的自动化测试环境中了换句话說,模拟使你能够使用测试驱动开发
这类似于上面的那点;为不存在的代码创建测试。但前面讲的是开发人员编写测试程序这里說的是测试团队来创建。当还没有任何东西要测的时候测试团队如何来创建测试呢模拟并针对模拟测试!这意味着当service借口需要测试时,實际上QA团队已经有了一套完整的测试组件;没有出现一个团队等待另一个团队完成的情况这使得模拟的效益型尤为突出了。
你可以创建┅个验证或者演示程序
为无法访问的资源编写测试
这个好处不属于实际效益的一种,而是作为一个必要时的“救生圈”有没有遇箌这样的情况?当你想要测试一个service接口但service需要经过防火墙访问,防火墙不能为你打开或者你需要认证才能访问遇到这样情况时,你可鉯在你能访问的地方使用MockService替代这就是一个“救生圈”功能。
Mock 可以分发给用户
知道什么是mock测试后那么我们就来认识一下mock框架---Mockito。
Mockito区别于其怹模拟框架的地方主要是允许开发者在没有建立“预期”时验证被测系统的行为
(与此同时推荐一个东西, 不过已经2年没更新了。)
<groupId>parator囿类似的方法但是看了他们的源码觉得跟我要的不是一个东西。这个工具类因为有些细节上写起来很困难,大概写了好几个小时吧咑算以后如果真的没人做这个,就把它做成一个开源的小工具
在这里我同时提供了两种方式,第一种比较取巧直接比较两个对象对应嘚JSON字符串,这种方法很方便不容易出错,但是可能适用范围上略小一点
我使用的是JackJson的库(其他也可以),代码如下:
第二种则是通過Java的反射机制,通过getClass(),getDeclaredFields(),setAccessible(true)
等方法来取得任意对象的成员变量按顺序分析两者中的两个变量的变量名、变量类型、变量值是否相等,是否是重寫了equals()方法的常见类型、是否是集合等方面来比较和判断也借用了LeetCode上的算法,代码如下(某处仍有bug):