单元测试——破除依赖
痛点是什么
要测试的对象依赖另一个你无法控制(或者还未实现)的对象。这个对象可能是Web服务、系统时间、线程调试、接口或者其他。
重要的问题是:你的测试代码不能控制这个依赖的对象向你的代码返回什么值,也不能控制它的行为(例如想模拟一个异常)。
何以解忧,唯有存根或者模拟对象
。
什么是存根
一个存根是对系统中存在的一个依赖项(或者协作者)的可控制的替代物。通过使用存根,你在测试代码时无需直接处理这个依赖项。
什么是模拟对象
模拟对象是系统中的伪对象,它可以验证被测试对象是否按预期的方式调用了这个伪对象,因此通过或者是失败。通常每个测试最多有一个模拟对象
存根和模拟对象区别
它们二者其他都是伪对象。二者最根本的区别是存根不会导致测试失败,而模拟对象可以。即存根不参与断言,而模拟对象参与断言。
怎么实现
手工
竟然还想着手工实现。。。。但是还是简单说一下原理,如果有想深入了解,可以参见《单元测试的艺术》
- 加一个中间层,让测试类实现它,然后编写一个用于单元测试的实现类
- 继承测试类,编写一个单元测试的实现类,重写方法并赋值返回值。
- 通过工厂创建存根对象
- 通过Ioc创建存根对象
- 通过反射注入属性生成存根对象
- ......
框架
目前也在找比较适合的框架。所说EasyMock太过时了,还要使用PowerMock。Jmockito和其他的不受限的mock框架还在学习中。正在觅食一个能降低隔离复杂度的框架。
下面陈述一下我想找的隔离框架的几个特性
- 支持AAA原则,即“准备——执行——断言”结果的框架,不大想用“录制——重放”的方法。因为不自然。
- 框架必须是不受限的。可以支持静态方法,私有构建等。哈哈,因为我比较贪心
- 框架有比较友好的文档。这样可以降低学习曲线。
- 框架的语法,看得更自然舒服些。毕竟要用很久,顺眼很重要!!
- 最好是能支持灵活的参数mock。就像EasyMock.anyString()。因为有些参数确实不想关心。
【【【版权所有,转载请注明原文链接。】】】
文中有不妥或者错误的地方还望指出,以免误人子弟。如果觉得本文对你有所帮助不妨【推荐】一下!如果你有更好的建议,可以给我留言讨论,共同进步!
再次感谢您耐心的读完本篇文章。
【【【我们所浪费的今天,是昨天死去的人奢望的明天;我们所厌恶的现在,是未来的自己回不去的曾经】】】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?