一、前期准备~
1、准备工作
2、入门知识
1)Mockito:简单轻量级的做mocking测试的框架;
2)mock对象:在调试期间用来作为真实对象的替代品;
3)mock测试:在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试;
4)stub:打桩,就是为mock对象的方法指定返回值(可抛出异常);
5)verify:行为验证,验证指定方法调用情况(是否被调用,调用次数等);
3、五分钟入门Demo
二、让我们开始学习吧!
1、行为验证
一旦mock对象被创建了,mock对象会记住所有的交互,然后你就可以选择性的验证你感兴趣的交互,验证不通过则抛出异常。
2、如何做一些测试桩stub
默认情况下,所有的函数都有返回值。mock函数默认返回的是null,一个空的集合或者一个被对象类型包装的内置类型,例如0、false对应的对象类型为Integer、Boolean;
一旦测试桩函数被调用,该函数将会一致返回固定的值;
对于 static 和 final 方法, Mockito 无法对其 when(…).thenReturn(…) 操作。
3、参数匹配器
参数匹配器使验证和测试桩变得更灵活;
为了合理的使用复杂的参数匹配,使用equals()与anyX() 的匹配器会使得测试代码更简洁、简单。有时,会迫使你重构代码以使用equals()匹配或者实现equals()函数来帮助你进行测试;
如果你使用参数匹配器,所有参数都必须由匹配器提供;
支持自定义参数匹配器;
4、执行顺序验证
验证执行顺序是非常灵活的-你不需要一个一个的验证所有交互,只需要验证你感兴趣的对象即可;
你可以仅通过那些需要验证顺序的mock对象来创建InOrder对象;
5、确保交互(interaction)操作不会执行在mock对象上
一些用户可能会在频繁地使用verifyNoMoreInteractions(),甚至在每个测试函数中都用。但是verifyNoMoreInteractions()并不建议在每个测试函数中都使用;
verifyNoMoreInteractions()在交互测试套件中只是一个便利的验证,它的作用是当你需要验证是否存在冗余调用时;
6、使用注解简化mock对象创建
注意!下面这句代码需要在运行测试函数之前被调用,一般放到测试类的基类或者test runner中:
也可以使用内置的runner: MockitoJUnitRunner 或者一个rule : MockitoRule;
7、监控真实对象(部分mock)
可以为真实对象创建一个监控(spy)对象。当你使用这个spy对象时真实的对象也会也调用,除非它的函数被stub了;
尽量少使用spy对象,使用时也需要小心形式,例如spy对象可以用来处理遗留代码;
stub语法中同样提供了部分mock的方法,可以调用真实的方法;
完全mock:
上文讲的内容是完全mock,即创建的mock对象与真实对象无关,mock对象的方法默认都是基本的实现,返回基本类型。可基于接口、实现类创建mock对象。
部分mock:
所谓部分mock,即创建的mock对象时基于真实对象的,mock对象的方法都是默认使用真实对象的方法,除非stub之后,才会以stub为准。基于实现类创建mock对象,否则在没有stub的情况下,调用真实方法时,会出现异常。
注意点:
Mockito并不会为真实对象代理函数调用,实际上它会拷贝真实对象。因此如果你保留了真实对象并且与之交互,不要期望从监控对象得到正确的结果。 当你在监控对象上调用一个没有被stub的函数时并不会调用真实对象的对应函数,你不会在真实对象上看到任何效果
8、@Mock 和 @Spy的使用
@Mock 等价于 Mockito.mock(Object.class);
@Spy 等价于 Mockito.spy(obj);
9、ArgumentCaptor(参数捕获器)捕获方法参数进行验证。(可代替参数匹配器使用)
在某些场景中,不光要对方法的返回值和调用进行验证,同时需要验证一系列交互后所传入方法的参数。那么我们可以用参数捕获器来捕获传入方法的参数进行验证,看它是否符合我们的要求。
ArgumentCaptor介绍
通过ArgumentCaptor对象的forClass(Class
ArgumentCaptor的Api
argument.capture() 捕获方法参数
argument.getValue() 获取方法参数值,如果方法进行了多次调用,它将返回最后一个参数值
argument.getAllValues() 方法进行多次调用后,返回多个参数值
10、简化 ArgumentCaptor 的创建
11、高级特性:自定义验证失败信息
12、高级特性:修改没有测试桩的调用的默认返回值
可以指定策略来创建mock对象的返回值。这是一个高级特性,通常来说,你不需要写这样的测试;
它对于遗留系统来说是很有用处的。当你不需要为函数调用打桩时你可以指定一个默认的answer;
三、学习了这么多,牛刀小试一下!
测试实体类
持久层DAO
业务层Service接口
业务层Serive实现类
现在我们的Service写好了,想要单元测试一下,但是Dao是其他人开发的,目前还没有写好,那我们如何测试呢?
根据以上代码我们可以知道,当我们的待测类开发完成而依赖的类的实现还没有开发完成。此时,我们就可以用到我们的Mock测试,模拟我们依赖类的返回值,使我们的待测类与依赖类解耦。这样,我们就可以对我们的待测类进行单元测了。
四、参考文档及进一步学习~
行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: ,里面有各种软件测试+开发资料和技术可以一起交流学习哦。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/18016.html