调用由SaveArg捕获的std::函数

GMock, invoking std::function captured by SaveArg

本文关键字:std 函数 SaveArg 调用      更新时间:2023-10-16
std::function<result(xxx &, yyy)> l_function;
auto l_strategyMock = std::make_shared<StrategyMock>();
EXPECT_CALL(*m_strategyFactoryMock, createStrategy("default", _))
            .WillRepeatedly(DoAll(SaveArg<1>(&l_function),
                                  Return(l_strategyMock)));
EXPECT_CALL(*l_strategyMock, invokeFunction(_, _)) //invokeFunction(xxx &, yyy)
            .WillOnce(Invoke(l_defaultHoStartRequestFiller));

这个代码崩溃了:

C++ exception with description "bad_function_call" thrown in the test body.

第一个函数以lambda作为参数调用<1>。我想捕获它,然后在第二次EXPECT_CALL时调用它,但l_function似乎没有初始化。

是否有像"InvokePointee"这样的东西来完成这项工作?

使用std::reference_wrapper<T>。它提供了一个函数调用操作符,它本身是一个可复制类型:

EXPECT_CALL(*l_strategyMock, invokeFunction(_, _))
        .WillOnce(Invoke( std::ref(l_function) ));
//                        ~~~~~~~~^          ^