【问题标题】:GMock doesn't compile, virtual function with user type reference argumentGMock 不编译,带有用户类型引用参数的虚函数
【发布时间】:2016-10-11 15:58:06
【问题描述】:

我正在尝试模拟一个抽象类,但我不断从 GMock 标头内部收到编译错误。我不能分享实际的代码,但几乎和下面的一样。模拟工作正常,但我不得不更改“DoStuff”函数以获取对象但引用。从那时起它就无法编译。错误类似于 * GMock 无法将“元素”与 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);
}

【问题讨论】:

    标签: c++ reference virtual googlemock gmock


    【解决方案1】:

    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 类是抽象的和/或没有 operator == - 所以默认匹配器 ::testing::Eq 不能使用。

    【讨论】:

    • 感谢您的快速回复,我不需要确切的“元素”,我需要测试是否正在调用该函数。但再次感谢,我会尝试你的建议。
    • 你可以使用任何匹配器testing::_,如果这就是你所需要的EXPECT_CALL(mf, DoStuff(_));
    • 谢谢,那就更好了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多