嵌套对象的 Gmock

Gmock for a nested object

我需要为在 dosomething 中调用的函数 foo 制作一个 mock,是否可以使用 gmock?

class Base
{
public:
    int foo()
    {

    }
};


class A {

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

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

private:
    Base* pointer;
};

您需要使用 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 及更高版本中你几乎不需要它。

如果您想从 Base 模拟 foo,请将其设为 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;
};

实例化 MyMock 并在您的测试预期中使用它。