GoogleTest Mock Actions 详解:掌握测试替身行为控制

GoogleTest Mock Actions 详解:掌握测试替身行为控制

googletest googletest 项目地址: https://gitcode.com/gh_mirrors/goo/googletest

什么是 Mock Actions

在单元测试中,Mock Actions(模拟行为)是定义测试替身(Mock)在被调用时应该如何响应的重要机制。GoogleTest 提供了一套丰富的内置 Actions,允许开发者精确控制 Mock 对象的行为,从而构建各种测试场景。

返回值类型 Actions

基础返回值控制

  1. Return()
    用于无返回值(void)的 Mock 方法,表示直接返回。

  2. Return(value)
    返回指定值,如果值的类型与 Mock 方法返回类型不同,会在设置期望时进行类型转换。

  3. ReturnArg<N>()
    返回 Mock 方法的第 N 个参数(0-based),适用于需要将输入参数直接返回的场景。

指针与引用相关

  1. ReturnNew<T>(args...)
    每次调用返回一个新的 T 类型对象,通过构造函数参数创建。

  2. ReturnPointee(ptr)
    返回指针 ptr 指向的值,适用于模拟解引用操作。

  3. ReturnRef(variable)
    返回变量的引用,注意引用的生命周期管理。

  4. ReturnRefOfCopy(value)
    返回 value 的拷贝的引用,拷贝的生命周期与 Action 相同。

高级返回值模式

ReturnRoundRobin({a1, ..., ak})
实现轮询返回模式,每次调用依次返回列表中的下一个值,到达末尾后循环回到开头。

副作用类型 Actions

参数修改类

  1. Assign(&variable, value)
    将值赋给指定变量,常用于模拟输出参数。

  2. SetArgReferee<N>(value)
    修改第 N 个引用参数的值。

  3. SetArgPointee<N>(value)
    修改第 N 个指针参数指向的值。

资源管理类

  1. DeleteArg<N>()
    删除第 N 个指针参数,模拟资源释放。

  2. SetArrayArgument<N>(first, last)
    将源范围 [first, last) 的元素复制到第 N 个参数指向的数组。

错误模拟类

SetErrnoAndReturn(error, value)
设置 errno 并返回值,模拟系统调用错误。

函数调用类 Actions

直接调用

  1. Invoke(f)
    使用 Mock 方法的参数调用 f(函数、函数对象等)。

  2. Invoke(object_ptr, &Class::method)
    调用对象的成员方法。

无参调用

  1. InvokeWithoutArgs(f)
    调用不需要参数的函数。

  2. InvokeWithoutArgs(object_ptr, &Class::method)
    调用对象的无参方法。

参数转发调用

InvokeArgument<N>(args...)
将 Mock 方法的第 N 个参数作为可调用对象进行调用,并传递指定参数。

复合 Actions

  1. DoAll(a1, a2, ..., an)
    执行多个 Action,返回最后一个 Action 的结果。

  2. WithArg<N>(a)
    将第 N 个参数传递给指定 Action 执行。

  3. WithArgs<N1, N2,...>(a)
    将多个选定参数传递给 Action。

自定义 Actions

GoogleTest 提供了强大的宏来定义自定义 Action:

  1. ACTION(name)
    定义无参数 Action,通过 arg0, arg1 等访问 Mock 方法参数。

  2. ACTION_P(name, param)
    定义带参数的 Action。

  3. ACTION_Pk(name, p1, ..., pk)
    定义多参数 Action。

最佳实践与注意事项

  1. 生命周期管理
    使用 Invoke 时要注意回调对象的生命周期,建议使用永久性对象。

  2. 引用参数处理
    InvokeArgument 中传递引用参数时,需要使用 std::ref 包装。

  3. 类型安全
    Return(value) 的类型转换发生在设置期望时,而非执行时,这可能导致意外的类型转换问题。

  4. 复合 Action 限制
    DoDefault() 不能在复合 Action 中使用,会导致运行时错误。

通过合理组合这些 Actions,可以构建出各种复杂的测试场景,全面验证被测代码的行为。掌握这些 Actions 的使用是编写高质量单元测试的关键技能之一。

googletest googletest 项目地址: https://gitcode.com/gh_mirrors/goo/googletest

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贡沫苏Truman

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

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

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

打赏作者

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

抵扣说明:

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

余额充值