GMock,调用 SaveArg 捕获的 std::function
GMock, invoking std::function captured by SaveArg
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) ));
// ~~~~~~~~^ ^
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) ));
// ~~~~~~~~^ ^