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

如何使用GMock模拟包含std::function成员的C++11回调结构体

解决GMock模拟std::function回调的问题

你的问题出在对MockFunction的用法理解上,MockFunction的模板参数需要是函数签名(比如bool()),而不是std::function类型。另外,GMock的MockFunction对象不能直接赋值给std::function,需要用它的AsStdFunction()方法转换。

第一步:修正MockFunction的定义

你原来写的MockFunction<Callbacks::start>是错误的,因为Callbacks::start是std::function<bool()>类型,正确的做法是传入该函数对象对应的函数签名:

// StartFunc对应签名bool()
testing::MockFunction<bool()> startFuncMock;
// FinishFunc对应签名bool(int)
testing::MockFunction<bool(int)> finishFuncMock;

第二步:将Mock对象转换为std::function并赋值

MockFunction实例本身不是std::function,所以需要调用AsStdFunction()方法转换成对应的std::function类型,才能赋值给Callbacks的成员:

Callbacks cb;
cb.start = startFuncMock.AsStdFunction();
cb.finish = finishFuncMock.AsStdFunction();

do_something(cb);

额外注意:原代码的一个编译错误

你的do_something函数里有个明显的错误:callbacks.start(true);,但StartFunc是std::function<bool()>(无参函数),这里传入参数true会导致编译失败。你需要二选一:

  1. 修改StartFunc的签名为std::function<bool(bool)>,匹配调用方式;
  2. 把调用改成callbacks.start();,匹配现有的无参签名。

完整测试示例(含验证)

如果要验证回调是否被正确调用,可以添加GMock的期望:

// 期望start被调用1次,返回true
EXPECT_CALL(startFuncMock, Call())
    .Times(1)
    .WillOnce(testing::Return(true));

// 期望finish被调用1次,参数任意,返回true
EXPECT_CALL(finishFuncMock, Call(testing::_))
    .Times(1)
    .WillOnce(testing::Return(true));

// 执行测试
do_something(cb);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:49:09