我已经用gmock从对象中嘲笑了一个函数。现在,我希望每次调用此函数时,都将对象Param作为参数传递给函数A。接下来,您可以找到一段代码]
//class I want to call
class A {
public:
void func1(const Param& p);
}
class IMock {
public:
virtual void func2(/*parameters*/) = 0;
}
class Mock : public IMock{
public:
MOCK_METHOD(void, func2, (/*parameters*/), (override));
}
测试:
A a;
Param param;
Mock mock;
EXPECT_CALL(mock, func2(_))
.WillOnce(
testing::WithArg<param>(testing::Invoke(&a, a.func1)));
但是我有以下编译错误:
param的值不能在常量表达式中使用
无效使用非静态成员函数virtual void A :: func1(const Param&)
有什么想法吗?
我总是在Invoke
中使用lambda表达式,因为恕我直言,这是最灵活的方法。
TEST(xxx, yyy)
{
A a;
Param param;
Mock mock;
EXPECT_CALL(mock, func2())
.WillOnce(Invoke([&a, ¶m]()
{
a.func1(param);
}));
mock.func2();
}
如果您不想传递对a
和param
的引用,则可以创建测试夹具,将它们声明为受保护的夹具字段,并将this
传递给lambda捕获块。
请注意,lambda表达式必须具有Mock::func2
的签名。在此示例中,它接受0个参数。
也是,你写了
每次调用此函数
在这种情况下,最好使用
ON_CALL(mock, mocked_method(/*params*/)).WillByDefault(Invoke(/*rest of the code*/));
尤其是如果您具有测试治具,并且可以在治具的构造函数(或SetUp
)中配置此默认操作。