打破依赖,使用模拟对象,桩对象,隔离框架
2015-08-27 11:27
239 查看
打破依赖,使用模拟对象,桩对象,隔离框架
在上节中,完成了第一个单元测试,研究了各种特性,在本节,将介绍一些更实际的例子。SUT依赖于一个不可操控的对象,最常见的例子是文件系统,线程,内存和时间等。本系列将分成3节:
单元测试基础知识
打破依赖,使用模拟对象,桩对象,隔离框架
创建优秀的单元测试
本节索引:
伪对象、桩对象、 模拟对象
为什么需要伪对象,如何处理
手工新建伪对象
使用隔离框架创建伪对象
伪对象(fake) 桩对象(stub) 模拟对象(mock)
伪对象是一个通用术语,它即可指桩对象,也可指模拟对象。
桩对象是指对系统中现有依赖项的一个替代品,可人为控制。
模拟对象是用来决定一个单元测试是通过还是失败的伪对象。
说明:fake是stub和mock的统称,因为看起来都像是真的对象。如果是用来检查交互的就是模拟对象,否则就是桩对象
桩对象:
模拟对象:
为什么需要伪对象
外部依赖(系统中代码与其交互的对象,而且无法对其做人为控制)
反测试(而一旦测试中存在外部依赖,那么这个测试就是一个集成测试。运行慢,需要配置,依赖异常)
如何处理?
本质上都是外部依赖导致的,所以要做的是消除依赖。
分析接口
实现可人为控制的接口
注入桩对象
在构造函数上接受一个接口,并保存在一个字段里,以备后用。
保存在属性上
在调用方法前,使用方法参数,工厂类,依赖注入等
隐藏桩对象(由于生产环境等其他原因,我们不希望暴露桩对象)
使用条件编译
使用条件特性
使用internal和[InternalVisibleTo]
手工新建伪对象
使用桩对象(适用于模拟返回值,不适用于检查对象间的交互情况。)
这是非常常见的方式,但是这种方式受限制很多,如文件需要配置,运行慢。
当上面的方法返回false的时候,需要调用别的web服务记录下。而web服务还未开发好,即使开发好了,测试的时间也会变长很多。
这里其实也体现了,stub的优点,可以任意的控制返回结果。
新建一个mock
使用隔离框架创建伪对象
隔离框架简介
手写stub和mock非常麻烦耗时,而且不易看懂等缺点。
隔离框架是可以方便的新建stub和mock的一组可编程API。
.net下常见的有Rhino Mocks,Moq
这里使用RhinoMocks做示例(将使用录制回放模式和操作断言2种)
录制回放
新建mock对象
来实现一个和上面mock的例子
非严格模拟对象:是指执行到最后一行,才会报错。
新建stub对象
注意:使用框架创建的动态伪对象,肯定没手工编写的伪对象执行效率高。
相关文章推荐
- BA-给排水-供水系统自动控制(转载)
- JSTL对Map集合的操作
- C 二进制读取文件
- 重温java基础
- Spring InitializingBean的作用
- River Hopscotch(POJ--3258【二分查找】
- iOS开发UI篇—在UItableview中实现加载更多功能
- 完美跳槽,注意这八点!
- 正则表达式
- 我来说说2015年8月25日锤子科技夏季手机发布会的内情
- 重温java基础
- ava1.5中{@inheritDoc}的使用
- JQuery动画插件Velocity.js
- 命令行添加PATH
- SqlServer数据类型
- Java多线程之Lock的使用<转>
- 图的遍历
- C#中图片与BASE64码互相转换
- Qt+MSVC2013 使用QtCreator中文乱码问题
- 数据备份