GMock 不编译,带有用户类型引用参数的虚函数

GMock doesn't compile, virtual function with user type reference argument

我正在尝试模拟一个抽象 class 但我不断从 GMock headers 内部收到编译错误。我无法分享实际代码,但与下面几乎相同。模拟工作正常,但我不得不更改 "DoStuff" 函数以获取 object 但引用。从那时起它就不会编译。错误类似于 * GMock 无法将 "Element" 与 long long * 进行比较。

"C++ code"

using ::testing::NiceMock;

class Element{};

class Foo
{
   public:
       virtual void DoStuff(Element&) = 0;
};

class MockFoo : public Foo
{
   public:
       MockFoo() {};
       MOCK_METHOD1(DoStuff, void(Element&));

};

TEST(example, test)
{
   NiceMock<MockFoo> mf;
   Element element{};
   EXPECT_CALL(mf, DoStuff(element)).Times(1);

   mf.DoStuff(element);
}

看看generic comparisons matchers.

如果您想检查通过 mf.DoStuff 传递给模拟对象的完全相同的元素 - 使用 ::testing::Ref 匹配器:

EXPECT_CALL(mf, DoStuff(Ref(element)));

(注意:Times(1) 是默认值 - 所以不是必需的)。

如果您想检查传递的对象是否具有完全相同的值 - 为其定义比较运算符 - 或者使用一些适当的匹配器 - 如 ::testing::Property - 如:

EXPECT_CALL(mf, DoStuff(AllOf(Property(&Example::getX, expectedXValue),
                              Property(&Example::getY, expectedYValue))));

我猜你的确切问题是因为你的实际 Example class 是抽象的 and/or 没有 operator == - 所以默认匹配器 ::testing::Eq 不能用过。