来自模拟对象的方法未被调用

Method from mock object not being called

我有这个代码。 我有一个真实的对象,它是用模拟对象初始化的。 当我从应该从模拟对象调用方法的真实对象调用方法时,它不会从模拟对象调用方法,而是从基础 class 调用方法。 为什么它不从模拟对象调用方法,我该如何解决这个问题?

谢谢

class Parent
{
public:
   virtual bool verify() const;
};

class MockParent : public Parent
{
public:
   MOCK_METHOD(bool, verify, (), (const, override));
};

class MyObject
{
public:
   MyObject(Parent parent) :_parent(parent) {}
   Parent parent;

};

class Testclass : ::testing::Test
{
   TestClass() : mockParent(), myObject(mockParent) {}

   MyObject myObject;
   MockParent mockParent;
};

TEST_F(Testclass , test1)
{
// here I assume that it should call the method from the mock
   EXPECT_CALL(this->myObject.mockParent, verify()).WillOnce(testing::Return(true));

//call method from myObject that calls parent.verify
}

为了触发多态调用,您需要传递指向基 class 的指针或引用,而不是直接传递基 class:

class MyObject
{
public:
   MyObject(Parent& parent) :_parent(parent) {}
private: // members are usually private
   Parent& parent;
};

这将使您能够调用正确的方法。另外,请记住 Parent 应该比 MyObject 长(这样你就可以避免悬空引用错误)。

一些补充说明:最好保持纯虚基础class:

class ParentBase
{
public:
   virtual ~ParentBase() = default;
   virtual bool verify() const = 0;
};

并且 ParentParentMock 都可以从 ParentBase 推断出来。这会强制执行更好的关注点分离 - 您的 classes 将处理接口,而不是实现。