我需要对函数foo进行模拟,该函数在dosomething中被调用,使用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和更高版本中几乎不需要它。
如果要从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;
};