问题
在编写单元测试时,通常需要模拟对象。为了使生产对象可替换,模拟对象类从生产对象类派生并覆盖一些虚函数。
当生产类没有虚函数并且您无法更改它时,就会出现问题。现在我看到两个选择来解决这个问题。
将您的类转换为由子系统类型参数化的类模板。您的生产类将
用于测试将使用MyClass<ProductionSubsystem>
MyClass<MockSubsystem>
手动编写一个带有虚函数的包装器,调用被包装子系统类的非虚函数。然后模拟包装器。
我对这两种选择中的任何一种都不完全满意。1 迫使我将我的“简单”类变成类模板,2 迫使我编写大量样板代码。
所以我想知道是否可以自动化为非虚拟类编写包装器的过程。我想象这样的事情:
// The subsystem that contains the production code
class Interface
{
void nonVirtualFunction();
}
// Contains the same functions as Interface but does not derive from it
class Implementation
{
void nonVirtualFunction();
};
// wrapper base class that provides the virtual interface
template<typename Interface>
class AutoWrapper
{
// Do some magic to provide the same functions that Interface has, but virtual.
}
// Class to provide the interface of AutoWrapper<Interface> but calls the functions in Implentation.
template<typename Implementation, template Interface>
class AutoWrapperImpl
{
// do some other magic here ...
};
此设置应允许以下用例:
// code using the AutoWrapper
void useAutoWrapper()
{
AutoWrapper<Interface> wrapper = new AutoWrapper<Interface>();
wrapper->nonVirtualFunction(); // calls Interface::nonVirtualFunction()
wrapper = new AutoWrapperImpl<Interface,Implementation>();
wrapper->nonVirtualFunction(); // calls Implementaion::nonVirtualFunction()
}
问题
是否可以在 C++ 中实现 AutoWrapper 和 AutoWrapperImpl 这两个类?如果是,它是如何完成的,是否有公开的解决方案?