GoogleTest Mock Actions 详解:掌握测试替身行为控制
googletest 项目地址: https://gitcode.com/gh_mirrors/goo/googletest
什么是 Mock Actions
在单元测试中,Mock Actions(模拟行为)是定义测试替身(Mock)在被调用时应该如何响应的重要机制。GoogleTest 提供了一套丰富的内置 Actions,允许开发者精确控制 Mock 对象的行为,从而构建各种测试场景。
返回值类型 Actions
基础返回值控制
-
Return()
用于无返回值(void)的 Mock 方法,表示直接返回。 -
Return(value)
返回指定值,如果值的类型与 Mock 方法返回类型不同,会在设置期望时进行类型转换。 -
ReturnArg<N>()
返回 Mock 方法的第 N 个参数(0-based),适用于需要将输入参数直接返回的场景。
指针与引用相关
-
ReturnNew<T>(args...)
每次调用返回一个新的 T 类型对象,通过构造函数参数创建。 -
ReturnPointee(ptr)
返回指针 ptr 指向的值,适用于模拟解引用操作。 -
ReturnRef(variable)
返回变量的引用,注意引用的生命周期管理。 -
ReturnRefOfCopy(value)
返回 value 的拷贝的引用,拷贝的生命周期与 Action 相同。
高级返回值模式
ReturnRoundRobin({a1, ..., ak})
实现轮询返回模式,每次调用依次返回列表中的下一个值,到达末尾后循环回到开头。
副作用类型 Actions
参数修改类
-
Assign(&variable, value)
将值赋给指定变量,常用于模拟输出参数。 -
SetArgReferee<N>(value)
修改第 N 个引用参数的值。 -
SetArgPointee<N>(value)
修改第 N 个指针参数指向的值。
资源管理类
-
DeleteArg<N>()
删除第 N 个指针参数,模拟资源释放。 -
SetArrayArgument<N>(first, last)
将源范围 [first, last) 的元素复制到第 N 个参数指向的数组。
错误模拟类
SetErrnoAndReturn(error, value)
设置 errno 并返回值,模拟系统调用错误。
函数调用类 Actions
直接调用
-
Invoke(f)
使用 Mock 方法的参数调用 f(函数、函数对象等)。 -
Invoke(object_ptr, &Class::method)
调用对象的成员方法。
无参调用
-
InvokeWithoutArgs(f)
调用不需要参数的函数。 -
InvokeWithoutArgs(object_ptr, &Class::method)
调用对象的无参方法。
参数转发调用
InvokeArgument<N>(args...)
将 Mock 方法的第 N 个参数作为可调用对象进行调用,并传递指定参数。
复合 Actions
-
DoAll(a1, a2, ..., an)
执行多个 Action,返回最后一个 Action 的结果。 -
WithArg<N>(a)
将第 N 个参数传递给指定 Action 执行。 -
WithArgs<N1, N2,...>(a)
将多个选定参数传递给 Action。
自定义 Actions
GoogleTest 提供了强大的宏来定义自定义 Action:
-
ACTION(name)
定义无参数 Action,通过 arg0, arg1 等访问 Mock 方法参数。 -
ACTION_P(name, param)
定义带参数的 Action。 -
ACTION_Pk(name, p1, ..., pk)
定义多参数 Action。
最佳实践与注意事项
-
生命周期管理
使用Invoke
时要注意回调对象的生命周期,建议使用永久性对象。 -
引用参数处理
在InvokeArgument
中传递引用参数时,需要使用std::ref
包装。 -
类型安全
Return(value)
的类型转换发生在设置期望时,而非执行时,这可能导致意外的类型转换问题。 -
复合 Action 限制
DoDefault()
不能在复合 Action 中使用,会导致运行时错误。
通过合理组合这些 Actions,可以构建出各种复杂的测试场景,全面验证被测代码的行为。掌握这些 Actions 的使用是编写高质量单元测试的关键技能之一。
googletest 项目地址: https://gitcode.com/gh_mirrors/goo/googletest
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考