来自模拟对象的方法未被调用
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;
};
并且 Parent
和 ParentMock
都可以从 ParentBase
推断出来。这会强制执行更好的关注点分离 - 您的 classes 将处理接口,而不是实现。
我有这个代码。 我有一个真实的对象,它是用模拟对象初始化的。 当我从应该从模拟对象调用方法的真实对象调用方法时,它不会从模拟对象调用方法,而是从基础 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;
};
并且 Parent
和 ParentMock
都可以从 ParentBase
推断出来。这会强制执行更好的关注点分离 - 您的 classes 将处理接口,而不是实现。