嵌套对象的模拟

问题描述 投票:-1回答:2

我需要对函数foo进行模拟,该函数在dosomething中被调用,使用gmock可以吗?

class Base
{
public:
    int foo()
    {

    }
};


class A {

   A()  {
     pointer = new Base();
    }

    double dosomething()
    {
        //more code
        pointer->foo();
    }

private:
    Base* pointer;
};
c++ unit-testing mocking googletest gmock
2个回答
0
投票

您需要使用Dependency Injection。有很多方法可以做到这一点,我将介绍最简单的方法:

class Base
{
public:
    virtual int foo()
    {

    }
};

class BaseMock: public Base {
    MOCK_METHOD(int, foo, (), (override));
};

class A {

   A(Base* providedBase = new Base)  {
     pointer = providedBase;
    }

    double dosomething()
    {
        //more code
        pointer->foo();
    }

private:
    Base* pointer;
};

现在,在单元测试中,您可以提供BaseMock代替Base

TEST(A_Test, dosomethingWorksCorrectly)
{
    BaseMock* mock = new BaseMock;
    EXPECT_CALL(*mock, foo()).WillOnce(Return(13));
    A uut(mock);
    uut.dosomething();
}

注意:避免在现代C ++中使用new。正确使用它很头疼,并且在C ++ 14和更高版本中几乎不需要它。


0
投票

如果要从foo模仿Base,请使其为virtual

class Base
{
public:
    virtual int foo()
    {

    }
};

定义您的模拟:

class MyMock : public Base{
    MOCK_METHOD(int, foo, (), (override));
}

您需要添加Base作为依赖项:

class A {

   A(Base* ptr):pointer{ptr}  {}

    double dosomething()
    {
        //more code
        pointer->foo();
    }

private:
    Base* pointer;
};
© www.soinside.com 2019 - 2024. All rights reserved.