mock的使用场合和时机:
(1)单元测试/接口测试中测试对象依赖其他对象,这些被依赖的对象构造复杂或耗时或根本无法构造(未交付)
(2)我们只测试对象内部逻辑的质量,不关心依赖对象的逻辑正确性和稳定性
基于以下两个原则去做mock。这样mock的投入产出比是最高的。
(1)不需要对所有的依赖对象进行mock,只对那些构造复杂、构造比较耗时的依赖进行mock
(2)若是分层自动化,高层的测试设计可以基于以下假设:
低层的测试已保证低层对象的质量,高层对低层的依赖可以mock
mock一方面加挡板,一方面可模拟返回数据。
测试驱动开发(TDD)在接口实现之前可以写接口测试。在开发过程中把测试添加到自动化测试环境中。
防止系统B出错引起测试错误
不会因系统B的开发进度影响测试,只要定义好了接口mock后即使B未开发完成仍能进行测试
一些速度较慢的操作处理复杂逻辑的接口,mock后可以快速返回,提升测试效率
模拟在应用中不容易构造的对象或比较复杂的对象,从而使测试顺利进行
mock的坏处在于很多情况下无法完全模拟出服务器的所有可能的返回情况,另外,mock掉了关联方之后,整个环境的连通性可能测试的不到位。
Mock 的关键点
模拟对象的概念就是我们想要创建一个可以替代实际对象的对象,这个模拟对象要可以通过特定参数调用特定的方法,并且能返回预期结果。
桩指的是用来替换具体功能的程序段。桩程序可以用来模拟已有程序的行为或是对未完成开发程序的一种临时替代。
比如我们有一个获取温度的函数。
publicdoublegetTemperature(String Position) {doubleret = TemperatureRead(Position);}
但是 TemperatureRead 函数要调用具体的硬件设备,而硬件设备没准备好。
我们可以用 Stub 来替换
publicdoubleTemperatureRead(String position) {return28;}
Stub:For replacing a method with code that returns a specified result
Mock:A stub with an expectations that the method gets called
通过设置预期明确 Mock 对象执行时会发生什么,比如返回特定的值、抛出一个异常、触发一个事件等,又或者调用一定的次数。
设置预期和验证预期是同时进行的。设置预期在调用测试类的函数之前完成,验证预期则在它之后。所以,首先你设定好预期结果,然后去验证你的预期结果是否正确。
这是个最大的好处吧。如果你创建了一个Mock那么你就可以在service接口创建之前写Service Tests了,这样你就能在开发过程中把测试添加到你的自动化测试环境中了。换句话说,模拟使你能够使用测试驱动开发。
这类似于上面的那点;为不存在的代码创建测试。但前面讲的是开发人员编写测试程序,这里说的是测试团队来创建。当还没有任何东西要测的时候测试团队如何来创建测试呢?模拟并针对模拟测试!这意味着当service借口需要测试时,实际上QA团队已经有了一套完整的测试组件;没有出现一个团队等待另一个团队完成的情况。这使得模拟的效益型尤为突出了。
由于Mocks非常高效,Mocks可以用来创建一个概念证明,作为一个示意图,或者作为一个你正考虑构建项目的演示程序。这为你决定项目接下来是否要进行提供了有力的基础,但最重要的还是提供了实际的设计决策。
这个好处不属于实际效益的一种,而是作为一个必要时的“救生圈”。有没有遇到这样的情况?当你想要测试一个service接口,但service需要经过防火墙访问,防火墙不能为你打开或者你需要认证才能访问。遇到这样情况时,你可以在你能访问的地方使用MockService替代,这就是一个“救生圈”功能。
在有些情况下,某种原因你需要允许一些外部来源访问你的测试系统,像合作伙伴或者客户。这些原因导致别人也可以访问你的敏感信息,而你或许只是想允许访问部分测试环境。在这种情况下,如何向合作伙伴或者客户提供一个测试系统来开发或者做测试呢?最简单的就是提供一个mock,无论是来自于你的网络或者客户的网络。soapUI mock非常容易配置,他可以运行在soapUI或者作为一个war包发布到你的java服务器里面。
有时,你希望在没有系统其他部分的影响下测试系统单独的一部分。由于其他系统部分会给测试数据造成干扰,影响根据数据收集得到的测试结论。使用mock你可以移除掉除了需要测试部分的系统依赖的模拟。当隔离这些mocks后,mocks就变得非常简单可靠,快速可预见。这为你提供了一个移除了随机行为,有重复模式并且可以监控特殊系统的测试环境。
Mockito 是一个简单的流行的 Mock 框架。它能够帮我们创建 Mock 对象,保持单元测试的独立性。
使用它只需要在 Maven 中添加依赖即可。
org.mockitomockito-all2.0.2-beta
class CreateMock {
@Beforepublicvoidsetup() {
mockUserDao = mock(UserDao.class);
userService =newUserServiceImpl();
userService.setUserDao(mockUserDao);
}}
class CreateMock {
@Mock
UserDao mockUserDao;
@InjectMocks
privateUserServiceImpl userService;
@Before
publicvoidsetUp() {
//初始化对象的注解
MockitoAnnotations.initMocks(this);
} }
参考:https://blog.csdn.net/wwh578867817/article/details/51934404
网友评论