嵌套对象的 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
并在您的测试预期中使用它。
我需要为在 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
并在您的测试预期中使用它。