如何用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
相关产品推荐
相关产品推荐

