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

gtest/gmock使用SaveArg保存mock入参报类型转换错误如何解决

报错原因

你写的SaveArg<0>(cb)用法不符合gmock的接口要求:SaveArg<N>动作的入参必须是用于存储第N个参数的变量的指针,你直接传入变量本身,会导致gmock内部无法构造匹配mock函数签名的Action对象,最终抛出类型转换的编译错误。

可行实现方式

把传入SaveArg的参数改为回调存储变量的地址即可,修正后的测试代码如下:

using callback = std::function<void(const int*)>;
callback cb;

// 传入&cb,让gmock把Subscribe收到的第0个参数存到cb变量里
EXPECT_CALL(*mock_data, Subscribe)
    .WillOnce(SaveArg<0>(&cb));

后续测试逻辑可以按你的原计划执行:先运行被测代码中会调用Subscribe完成订阅的流程,确认回调已经被存入cb后,构造测试数据传入cb触发回调,再断言回调触发后的业务逻辑是否符合预期,示例代码:

// 执行被测对象的订阅流程
your_test_target.RunSubscribeFlow();

// 构造测试数据触发保存的回调
int test_data = 456;
cb(&test_data);

// 编写断言验证回调触发后的逻辑
EXPECT_THAT(/* 你的断言条件 */);

注意:mock方法的const限定不会影响SaveArg的正常使用,不需要修改你原来写的MOCK_METHOD定义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:22:48