C++ 工程实践(6):单元测试如何 mock 系统调用

陈硕 (giantchen_AT_gmail)

Blog.csdn.net/Solstice

陈硕关于 C++ 工程实践的系列文章: http://blog.csdn.net/Solstice/category/802325.aspx

陈硕博客文章合集下载: http://blog.csdn.net/Solstice/archive/2011/02/24/6206154.aspx

本作品采用“Creative Commons 署名-非商业性使用-禁止演绎 3.0 Unported 许可协议(cc by-nc-nd)”进行许可。http://creativecommons.org/licenses/by-nc-nd/3.0/

摘要:本文讨论了在编写单元测试时 mock 系统调用(以及其他第三方库)的几种做法。

本文只考虑 Linux x86/amd64 平台。

陈硕在《分布式程序的自动化回归测试》 http://blog.csdn.net/Solstice/archive/2011/04/25/6359748.aspx 一文中曾经谈到单元测试在分布式程序开发中的优缺点(好吧,主要是缺点)。但是,在某些情况下,单元测试是很有必要的,在测试 failure 场景的时候尤显重要,比如:

  • 在开发存储系统时,模拟 read(2)/write(2) 返回 EIO 错误(有可能是磁盘写满了,有可能是磁盘出坏道读不出数据)。
  • 在开发网络库的时候,模拟 write(2) 返回 EPIPE 错误(对方意外断开连接)。
  • 在开发网络库的时候,模拟自连接 (self-connection),网络库应该用 getsockname(2) 和 getpeername(2) 判断是否是自连接,然后断开之。
  • 在开发网络库的时候,模拟本地 ephemeral port 用完,connect(2) 返回 EAGAIN 临时错误。
  • 让 gethostbyname(2) 返回我们预设的值,防止单元测试给公司的 DNS server 带来太大压力。

这些 test case 恐怕很难用前文提到的 test harness 来测试,该单元测试上场了。现在的问题是,如何 mock 这些系统函数?或者换句话说,如何把对系统函数的依赖注入到被测程序中?

系统函数的依赖注入

在Michael Feathers 的《修改代码的艺术 / Working Effectively with Legacy Code》一书第 4.3.2 节中,作者介绍了链接期接缝(link seam),正好可以解决我们的问题。另外&#x

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
在Java单元测试中,mock是指在测试过程中,对于一些不容易构造或获取的对象,创建一个模拟对象来模拟对象的行为。通过使用mock对象,我们可以控制对象的行为,以便更好地测试我们的代码。常用的mock框架有Mockito、EasyMock、JMockit、PowerMock、Spock等等,其中Mockito是Spring Boot默认的mock框架。使用Mockito,我们可以轻松地创建和配置mock对象,并验证它们的交互。下面是一些使用Mockito进行mock的示例代码: 1. 创建mock对象: ```java List<String> mockedList = Mockito.mock(List.class); ``` 2. 设置测试桩(Stubbing): ```java Mockito.when(mockedList.get(0)).thenReturn("first"); Mockito.when(mockedList.get(1)).thenThrow(new RuntimeException()); ``` 3. 验证某些行为: ```java mockedList.add("one"); Mockito.verify(mockedList).add("one"); ``` 通过使用mock对象和相应的框架,我们可以更好地进行单元测试,尤其是在需要模拟外部依赖或不容易构造的对象时。这样可以使我们的测试更加可靠和可控。 #### 引用[.reference_title] - *1* *2* *3* [Java单元测试使用mock【转载】](https://blog.csdn.net/zq980328/article/details/123848454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈硕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值