问题描述: 在使用gmock进行单元测试时,发现无法对接受lambda作为参数的函数进行expect_call调用,导致编译失败。
解决方法: 这个问题是由于gmock在处理lambda表达式时,存在一些限制造成的。下面给出两种解决方法。
方法一:使用MATCHER_P MATCHER_P是gmock中的一个宏,用于自定义参数匹配器。我们可以使用MATCHER_P来处理lambda表达式作为参数的情况。
示例代码:
#include
using namespace testing;
template
void funcWithLambda(Func&& func)
{
func();
}
MATCHER_P(LambdaMatcher, func, "")
{
func();
return true;
}
TEST(MyTest, TestFuncWithLambda)
{
MockFunction mockFunc;
EXPECT_CALL(mockFunc, Call(LambdaMatcher([](){ /* lambda body */ return; })));
funcWithLambda([](){ /* lambda body */ return; });
}
int main(int argc, char* argv[])
{
InitGoogleMock(&argc, argv);
return RUN_ALL_TESTS();
}
方法二:使用模板特化 另一种解决方法是通过对模板函数进行特化,来处理lambda表达式作为参数的情况。
示例代码:
#include
using namespace testing;
template
void funcWithLambda(Func&& func)
{
func();
}
template
void expectFuncWithLambda(MockFunction& mockFunc, Func&& func)
{
mockFunc.Call(func);
}
template<>
void expectFuncWithLambda(MockFunction& mockFunc, std::function&& func)
{
EXPECT_CALL(mockFunc, Call()).WillOnce([func]() { func(); });
}
TEST(MyTest, TestFuncWithLambda)
{
MockFunction mockFunc;
expectFuncWithLambda(mockFunc, [](){ /* lambda body */ return; });
funcWithLambda([](){ /* lambda body */ return; });
}
int main(int argc, char* argv[])
{
InitGoogleMock(&argc, argv);
return RUN_ALL_TESTS();
}
这两种方法都可以解决gmock无法对接受lambda作为参数的函数进行expect_call调用的问题。根据实际情况选择适合的方法即可。