使用gmock c ++调用真实对象的方法

问题描述 投票:0回答:1

我已经用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&)

有什么想法吗?

c++ googletest gmock
1个回答
0
投票

我总是在Invoke中使用lambda表达式,因为恕我直言,这是最灵活的方法。

TEST(xxx, yyy)
{
  A a;
  Param param;
  Mock mock;
  EXPECT_CALL(mock, func2())
    .WillOnce(Invoke([&a, &param]()
    {
      a.func1(param);
    }));
  mock.func2();
}

如果您不想传递对aparam的引用,则可以创建测试夹具,将它们声明为受保护的夹具字段,并将this传递给lambda捕获块。

请注意,lambda表达式必须具有Mock::func2的签名。在此示例中,它接受0个参数。

也是,你写了

每次调用此函数

在这种情况下,最好使用

ON_CALL(mock, mocked_method(/*params*/)).WillByDefault(Invoke(/*rest of the code*/));

尤其是如果您具有测试治具,并且可以在治具的构造函数(或SetUp)中配置此默认操作。

© www.soinside.com 2019 - 2024. All rights reserved.