如何使用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会导致编译失败。你需要二选一:
- 修改
StartFunc的签名为std::function<bool(bool)>,匹配调用方式; - 把调用改成
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
相关产品推荐
相关产品推荐

