2

问题

在编写单元测试时,通常需要模拟对象。为了使生产对象可替换,模拟对象类从生产对象类派生并覆盖一些虚函数。

当生产类没有虚函数并且您无法更改它时,就会出现问题。现在我看到两个选择来解决这个问题。

  1. 将您的类转换为由子系统类型参数化的类模板。您的生产类将MyClass<ProductionSubsystem>用于测试将使用MyClass<MockSubsystem>

  2. 手动编写一个带有虚函数的包装器,调用被包装子系统类的非虚函数。然后模拟包装器。

我对这两种选择中的任何一种都不完全满意。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 这两个类?如果是,它是如何完成的,是否有公开的解决方案?

4

0 回答 0