当我玩弄谷歌测试时,我遇到了一个难题。
我想对一个 C++ 类进行单元测试,该类基于来自外部系统的事件,将产生新的类来与系统中来来往往的实体对话。事件调度程序以及如何为专门的实体创建类都由我无法控制或更改的库决定。该库的设计要求我将某些参数传递给类构造函数关于如何连接到实体,如果该实体不存在,构造函数将抛出。由于将根据它们的存在和事件使用这些类,因此我希望能够EXPECT_CALL()
使用它们的方法。我显然需要一个可以模拟或以其他方式重载并返回模拟类而不是真实类的工厂。
我已经将事件监视器抽象为 IClass,以便我可以创建它的 Mock 并以受控方式提供事件。我创建了一个具有一系列 Construct[x] 方法的工厂,其中每个方法std::shared_ptr
为特定 IClass 的新实例返回一个。这很好用,我可以在我想以这种方式测试的类上运行一个完整的测试套件。包括适当的类破坏。
但是,我希望我的工厂更通用,我能想到的最好的方法是:
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 调用。
所以我的问题是:是否有可能为此创建一个通用工厂?如果是,我会怎么做?
在此先感谢您的帮助!