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

