GoogleTest Mock Actions 详解:模拟函数行为控制指南

GoogleTest Mock Actions 详解:模拟函数行为控制指南

googletest GoogleTest - Google Testing and Mocking Framework googletest 项目地址: https://gitcode.com/gh_mirrors/googl/googletest

什么是 Mock Actions

在单元测试中,Mock Actions(模拟行为)是定义模拟对象在被调用时应该如何响应的重要机制。GoogleTest 提供了一套丰富的内置 Actions,允许开发者精确控制模拟函数的行为,包括返回值设置、参数操作、异常抛出等多种场景。

返回值控制类 Actions

基础返回值设置

  1. Return():用于无返回值(void)的模拟函数
  2. Return(value):返回指定值,类型转换在设置期望时完成
  3. ReturnArg<N>():返回第N个参数(从0开始计数)

指针与引用相关

  • ReturnNull():返回空指针
  • ReturnPointee(ptr):返回指针指向的值
  • ReturnRef(variable):返回变量的引用
  • ReturnRefOfCopy(value):返回值的拷贝的引用

高级返回值模式

  • ReturnNew<T>(args...):每次调用返回新创建的T类型对象
  • ReturnRoundRobin({a1,...,ak}):轮询返回列表中的值

副作用类 Actions

这类 Actions 主要用于修改测试环境或被测对象的状态:

  1. Assign(&var, value):给变量赋值
  2. DeleteArg<N>():删除第N个参数(必须是指针)
  3. SaveArg<N>(ptr):保存第N个参数到指针指向的位置
  4. SetArgReferee<N>(value):给第N个参数引用的变量赋值
  5. SetArrayArgument<N>(first, last):复制范围到数组参数
  6. SetErrnoAndReturn(error, value):设置errno并返回值
  7. Throw(exception):抛出指定异常

函数调用类 Actions

这类 Actions 允许将调用转发给其他函数或方法:

直接调用

  • Invoke(f):调用全局/静态函数或函数对象
  • Invoke(obj_ptr, &Class::method):调用对象方法

无参调用

  • InvokeWithoutArgs(f):调用无参函数
  • InvokeWithoutArgs(obj_ptr, &Class::method):调用无参方法

参数转发

  • InvokeArgument<N>(args...):调用第N个参数(必须是可调用对象)

使用示例:

using ::testing::Invoke;
double Calculate(Unused, double x, double y) { return x*y; }
...
EXPECT_CALL(mock, Compute(_, _, _)).WillOnce(Invoke(Calculate));

复合 Actions

组合多个 Actions 实现复杂行为:

  1. DoAll(a1, a2, ...):执行所有Actions,返回最后一个的结果
  2. IgnoreResult(a):执行Action但忽略返回值
  3. WithArg<N>(a):将第N个参数传给Action执行
  4. WithArgs<N1,N2,...>(a):将选定参数传给Action
  5. WithoutArgs(a):无参执行Action

自定义 Actions

GoogleTest 提供了宏来定义自定义 Actions:

  1. ACTION(Name):定义无参Action

    ACTION(Sum) { return arg0 + arg1; }
    
  2. ACTION_P(Name, param):定义带参数的Action

    ACTION_P(Add, n) { return arg0 + n; }
    
  3. ACTION_Pk(Name, p1,...,pk):定义多参数Action

最佳实践与注意事项

  1. 生命周期管理Invoke会获取回调对象的所有权,应确保其生命周期足够长
  2. 引用传递:使用std::ref()包装需要引用传递的参数
  3. 类型安全Return(value)会立即进行类型转换,而非调用时转换
  4. 默认行为DoDefault()可用于执行ON_CALL()定义的默认行为

实际应用示例

TEST(MyTest, ComplexMockBehavior) {
    MockService service;
    int saved_arg = 0;
    std::vector<int> output;
    
    EXPECT_CALL(service, ProcessData(_, _))
        .WillOnce(DoAll(
            SaveArg<0>(&saved_arg),
            SetArgPointee<1>(100),
            Return(true)
        ));
    
    bool result = service.ProcessData(42, output);
    EXPECT_TRUE(result);
    EXPECT_EQ(saved_arg, 42);
    EXPECT_EQ(output[0], 100);
}

通过合理组合这些Actions,可以构建出各种复杂的模拟行为,满足不同场景下的单元测试需求。掌握这些Actions的使用,将显著提升单元测试的灵活性和表达能力。

googletest GoogleTest - Google Testing and Mocking Framework googletest 项目地址: https://gitcode.com/gh_mirrors/googl/googletest

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

郦蜜玲

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

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

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

打赏作者

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

抵扣说明:

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

余额充值