C++ C++;Google Mock-EXPECT_CALL()-未直接调用时,预期不起作用

C++ C++;Google Mock-EXPECT_CALL()-未直接调用时,预期不起作用,c++,unit-testing,mocking,googletest,googlemock,C++,Unit Testing,Mocking,Googletest,Googlemock,我对Google Mock还很陌生,所以边学边学。我刚刚添加了一些单元测试,但遇到了一个问题,我无法使用_CALL()来正确地存根从方法中调用的方法 下面的代码概述了我所拥有的 class simpleClass { public: bool simpleFn1() { return simpleFn2(); } virtual bool simpleFn2() { return FALSE; } } 在我的单元测试中,我有: class simpl

我对Google Mock还很陌生,所以边学边学。我刚刚添加了一些单元测试,但遇到了一个问题,我无法使用_CALL()来正确地存根从方法中调用的方法

下面的代码概述了我所拥有的

class simpleClass
{
    public:
        bool simpleFn1()  { return simpleFn2(); }
        virtual bool simpleFn2()  { return FALSE; }
}
在我的单元测试中,我有:

class simpleClassMocked : public simpleClass
{
    private:
        MOCK_METHOD0(simpleFn2, bool());
}

class simpleClassTests : public ::testing::Test
{
}

TEST_F(simpleClassTests, testSimpleFn2)
{
    shared_ptr<simpleClassMocked> pSimpleClass = shared_ptr< simpleClassMocked >(new simpleClassMocked());

    ON_CALL(*pSimpleClass, simpleF2()).WillByDefault(Return(TRUE));

    // This works as expected - simpleFn2() gets stubbed
    pSimpleClass->simpleFn2();

    // This doesn't work as expected - when simpleFn1 calls simpleFn2 it's not the stubbed expectation???
    pSimpleClass->simpleFn1();
}
class simpleClassMocked:公共simpleClass
{
私人:
模拟方法0(simpleFn2,bool());
}
类simpleClassTests:public::testing::Test
{
}
测试F(simpleClassTests,testSimpleFn2)
{
shared_ptr pSimpleClass=shared_ptr(新的simplelassmock());
ON_CALL(*pSimpleClass,simpleF2()).WillByDefault(Return(TRUE));
//这与预期的一样有效-simpleFn2()被截短
pSimpleClass->simpleFn2();
//这不符合预期-当simpleFn1调用simpleFn2时,这不是存根预期???
pSimpleClass->simpleFn1();
}

我想我肯定错过了一些明显的东西,有人能帮忙吗?谢谢

您必须将该方法标记为
virtual
,并在
simpleClassMock
类中添加相应的模拟函数

class simpleClass
{
    public:
        virtual bool simpleFn1()  { return simpleFn2(); }
        virtual bool simpleFn2()  { return FALSE; }
}
另外,您需要将模拟方法放在
公共
区域中

class simpleClassMocked : public simpleClass
{
    public:
        MOCK_METHOD0(simpleFn2, bool());
        MOCK_METHOD0(simpleFn1, bool());
}

它现在可以工作了

你的模拟方法需要是虚拟的。啊!就这样。谢谢:)我已经相应地更新了示例。谢谢你,Daksh。确保您试图模拟的方法被标记为“虚拟”是很容易忽略的。对于任何其他希望使用GoogleMock的人来说,这都是非常有用的资源。