【发布时间】:2021-06-04 11:53:40
【问题描述】:
我有一个继承自基本类的多个派生类,如下所示,我想模拟所有派生类。
我需要创建一个 MockBase 类还是需要在每个派生类模拟对象中重复基类方法?
注意:我想测试 Dervied1User 和 Dervied2User,因此想创建 MockDervied1 和 MockDerived2。 Dervied1User 调用了 Dervied1 和基类中的方法。
class base {
base() { .. }
virtual ~base(..) { ... }
virtual bool method0(..) { ... }
virtual bool method1(..) { ... }
virtual void method2(..) { ... }
};
class Derived1 : public base {
Derived1() { ... }
virtual int method3(..) { ... }
virtual int method4(..) { ... }
};
class Derived2 : public base() {
Derived2() { ... }
virtual int method5(..) { ... }
virtual int method6(..) { ... }
};
class Derived3 : public base() {
Derived2() { ... }
virtual int method7(..) { ... }
virtual int method8(..) { ... }
};
class Dervied1User {
public:
Dervied1User(std::unique_ptr<Derived1> d1_) : d1(std::move(d1_)) {}
int method9(..) {...}
private:
std::unique_ptr<Derived1> d1;
};
class Dervied2User {
....
}
派生类的模拟看起来像这样吗? ?在所有 Derived 类 mocks 中重复 method0、method1、method2。
class MockDerived1 : pubic Derived1 {
MOCK_METHOD(method0, ....)
MOCK_METHOD(method1, ....)
MOCK_METHOD(method2, ....)
MOCK_METHOD(method3, ....)
MOCK_METHOD(method4, ....)
}
class MockDerived2 : pubic Derived2 {
MOCK_METHOD(method0, ....)
MOCK_METHOD(method1, ....)
MOCK_METHOD(method2, ....)
MOCK_METHOD(method5, ....)
MOCK_METHOD(method6, ....)
}
【问题讨论】:
-
您可能已经知道这一点,但是为了其他人在这里的利益:首先使用非纯虚函数模拟类很容易出错,因为忘记模拟方法不会被捕获由编译器。通常,如果要模拟这样的类,您确实需要添加一个抽象接口根类,作为模拟目标以及在应用程序代码中传递的类型。总的来说,它也是更好的设计。
-
@Frank,我是谷歌测试的新手,不知道有纯虚函数的事实。谢谢你让我知道。我一定会考虑在不久的将来重构我的代码。
标签: c++ unit-testing googletest gmock