Google Test/Mock C++单元测试:如何Mock含指针参数的接口?
Google Mock 调用异常问题修复方案
问题根源
- 返回值类型不匹配:原接口
display定义返回bool,但测试中返回枚举值ErrorState::SERIAL_PORT_SUCCESS,类型冲突导致逻辑异常。 - 指针参数操作非法:传入的
name是只读字符串字面量,SetArgPointee<0>尝试修改只读内存,触发未定义行为;且字符串字面量是const char*,与接口的char*参数存在类型安全问题。
修复步骤
对齐返回值类型
将返回值改为接口要求的bool类型,若SERIAL_PORT_SUCCESS代表成功,直接返回true:EXPECT_CALL(mockHandler, display(testing::_)) .WillOnce(testing::DoAll(testing::SetArgPointee<0>(data), testing::Return(true)));修正指针参数使用方式
- 若
display是输出型接口(通过指针返回数据):
必须传入可写内存缓冲区,不能用只读字符串字面量:// 分配可写缓冲区 char name_buf[128] = {0}; // 配置Mock EXPECT_CALL(mockHandler, display(testing::_)) .WillOnce(testing::DoAll(testing::SetArgPointee<0>(data), testing::Return(true))); // 调用时传入可写缓冲区 mockHandler.display(name_buf); - 若
display是输入型接口(仅读取字符串):
修改原接口参数为const char*,避免不必要的指针修改:class Handler { public: virtual bool display(const char* name) = 0; }; // 对应的Mock类 class MockHandler : public Handler { public: MOCK_METHOD(bool, display, (const char* name), (override)); }; // 测试代码简化为 EXPECT_CALL(mockHandler, display(testing::_)) .WillOnce(testing::Return(true));
- 若
验证Mock类定义正确性
确保Mock类正确继承原接口并覆盖方法:class MockHandler : public Handler { public: MOCK_METHOD(bool, display, (char* name), (override)); };
内容的提问来源于stack exchange,提问作者Prasanth MV
相关产品推荐
相关产品推荐

