允许模拟类从最终类继承
Allow a mock class to inherit from a final class
我们可以使用新的C++关键字final
声明一个最终的/密封的不可继承类。
class Generator final
{
};
此类可以继承自其他类,也可以不具有虚拟类(继承或不继承)。但是,如何使它成为final
,同时允许一个类从中继承呢?
我们主要需要从真实类派生mock类(有或没有后期绑定,因此virtual
并不重要)。如何使其工作:
class MockGenerator : Generator{};
但不允许任何其他继承?
但是,如何使它成为最终的,同时允许一个类从中继承呢?
这是不可能的。
我们主要需要从真实类派生mock类(有或没有后期绑定,因此虚拟并不重要)。
如果该类是final,则不需要从中派生。如果确实需要从中派生,则不是最终。选择一个。
编辑:您可以向您的类添加限制,但这些限制对接口来说是自费的:
class Generator // not final
{
Generator(); // the only accessible constructor is private
// whitelist who has access to this constructor
friend class MockGenerator;
public:
// no public constructors here except for copy & move
Generator(Generator&);
Generator(Generator&&);
...
// provide controlled access to the private constructor
static Generator make_generator() { return Generator(); }
// rest of API here
};
这是一个允许其工厂和MockGenerator专业化调用其构造函数的类。然而,这是以阻止琐碎的建设为代价的。
旧代码(不再可编译):
Generator instance;
新代码(由私有构造函数强制执行):
auto instance = Generator::make_generator();
一种可能性是:使用define作为final,并在生成测试环境时将其定义为空。
#ifdef MOCK
#define CLASS_FINAL
#else
#define CLASS_FINAL final
#endif
edit:我同意utnapistim的评论:这不是一个建议,只是一种技术可能性(但至少比#define final
更好)。
如果您需要为单元测试创建mock类it,那么您可以尝试Typemock Isolator++。因为它很容易处理final
类。您甚至不需要更改生产代码中的某些内容(比如创建单独的mock类)。我创建了一个简单的测试来演示它:
class Generator final
{
public:
int foo()
{
return 0;
}
};
TEST_METHOD(TestFinal)
{
Generator* generator = FAKE<Generator>();
WHEN_CALLED(generator->foo()).Return(1);
int result = generator->foo();
Assert::AreEqual(1, result);
}
希望它能对你有用。
相关文章:
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 继承模板类中的类型别名
- 打印所有继承的类成员变量和方法
- 为什么我的子类不继承父类的字符串?
- 继承的类析构函数
- C++ 通过接口使用从其他几个类继承的类
- C++ 继承:基类中重载 operator+ 的 2 次在派生类中无法正常工作
- 从不完整的类继承的类模板
- 在谷歌测试中创建模拟类的向量
- C++排除通过派生类中的基类继承的类
- 继承 - 查找类的对象的大小
- 从继承的类C++强制转换
- 将模拟类添加到 stl 容器
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 从 c++ 中继承的类对基类的条件访问
- bad_weak_ptr使用从 boost::asio::io_context::service 继承的类
- 返回自身内部的双重嵌套类的成员函数,该类继承自从自身继承的类
- C++继承模板类:隐藏成员变量
- GMOCK 模拟类不继承任何类
- 允许模拟类从最终类继承