当我在玩Google测试时,我遇到了一个难题。
我想对基于来自外部系统的事件的C ++类进行单元测试,它将产生新类以与系统中正在进行的实体进行通信。事件调度程序以及如何为专用实体创建类都是由我无法控制或更改的库决定的。库的设计要求我将某些参数传递给类构造函数,以了解如何连接到实体,如果该实体不存在,构造函数将抛出。
由于这些类将根据它们的存在和事件使用,我希望能够EXPECT_CALL()
使用它们的方法。我显然需要一个工厂,我可以模拟或以其他方式重载并返回模拟类而不是真实类。
我已经将事件监视器抽象为IClass,这样我就可以创建它的模拟并以受控方式提供事件。我创建了一个具有一系列Construct [x]方法的工厂,其中每个方法都为特定IClass的新实例返回std::shared_ptr
。这很好用,我可以在我想要以这种方式测试的类上运行一个完整的测试套件。包括适当的阶级破坏。
但是,我希望我的工厂更通用,我能想到的最好的是:
class ClassFactory {
public:
template<class U, class... Args>
std::shared_ptr<U> Construct(Args&&... args) {
return std::make_shared<U>(std::forward<Args>((args)...));
}
};
我想测试的类,即使用类工厂的类已经在测试类编译时被编译成目标文件,因此上面模板化的工厂显然不会工作。模板已经过评估,测试类中没有任何形式的模板专业化将从我想要测试的类重新路由Construct调用。
所以我的问题是:是否可以为此创建一个通用工厂?如果是的话,我该怎么做?
提前感谢您的帮助!