You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用gmock mock修改入参的func2,以测试func1的if分支代码逻辑

用Google Mock mock修改入参的func2实现方案

你需要的核心能力是让mock的func2修改传入的指针参数指向的结构体内容,用gmock的SetArgPointee动作或者自定义ACTION就能实现,完整步骤如下:

1. 前置准备:定义mock接口

因为gmock基于C++实现,你需要把C语言的全局func2包装成可mock的接口,假设你的原有代码定义如下:

// 你的结构体定义
struct a {
  bool attr;
  // 其他属性按需添加
};
// func2原有签名
void func2(struct a* param);

首先实现mock相关的封装代码:

// func2的抽象接口类
class Func2Interface {
public:
  virtual ~Func2Interface() = default;
  virtual void func2(struct a* param) = 0;
};

// func2的mock类
class MockFunc2 : public Func2Interface {
public:
  MOCK_METHOD(void, func2, (struct a* param), (override));
};

// 全局mock实例指针,用于转发C代码的func2调用
MockFunc2* g_mock_func2 = nullptr;

// 给原C代码链接用的func2实现,转发到mock实例
extern "C" void func2(struct a* param) {
  if (g_mock_func2 != nullptr) {
    g_mock_func2->func2(param);
  }
}

2. 编写测试用例,实现修改入参的mock逻辑

有两种常用方式实现修改入参的需求:

方式一:用内置SetArgPointee动作(适合结构体可直接值拷贝的场景)

TEST(Func1Test, CheckIfBranchLogic) {
  MockFunc2 mock_instance;
  g_mock_func2 = &mock_instance;

  // 构造你需要的结构体值,把attr设为true
  struct a target_a = {
    .attr = true
    // 其他属性按需赋值
  };

  // 核心配置:func2被调用时,将第0个参数(传入的结构体指针)指向的内容设置为target_a
  ON_CALL(mock_instance, func2)
    .WillByDefault(SetArgPointee<0>(target_a));

  // 调用func1执行测试
  func1();

  // 这里补充你自己的断言,验证if分支内的逻辑执行结果
  // ...

  g_mock_func2 = nullptr;
}

方式二:自定义ACTION(适合结构体复杂、需要逐个修改属性的场景)

如果你的结构体无法直接值拷贝,或者只需要修改个别属性,可以自定义动作操作指针:

// 自定义动作:把传入的结构体的attr设为true
ACTION(SetAAttrTrue) {
  // arg0对应func2的第0个入参,也就是struct a*类型的指针
  arg0->attr = true;
  // 其他属性可以在这里逐个赋值
}

TEST(Func1Test, CheckIfBranchLogic) {
  MockFunc2 mock_instance;
  g_mock_func2 = &mock_instance;

  // 配置mock调用时执行自定义动作
  ON_CALL(mock_instance, func2)
    .WillByDefault(SetAAttrTrue());

  // 调用func1执行测试
  func1();

  // 补充你的断言
  // ...

  g_mock_func2 = nullptr;
}

关键说明

  • SetArgPointee<N>(value)是gmock的标准动作,N代表参数的索引(从0开始计数),仅作用于指针类型的参数,会把指针指向的内存赋值为value
  • 自定义ACTION中,arg0/arg1等变量分别对应被mock函数的第0/1个入参,可以直接操作这些参数完成任意修改逻辑

内容的提问来源于stack exchange,提问作者Mafalda Hopkirk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:57:05