我是 google test 的新手,总体来说对 C++ 也比较陌生。看下面的简化示例,测试 CDeviceCreator 的通用方法是什么?我一定需要模拟吗?我在谷歌测试中读到过有关模拟的内容,但很难理解它。您能否提供一个针对此案例的具体示例?提前致谢。
这是工厂类的接口(interface)
class IDeviceCreator
{
public:
IDeviceCreator(){
};
virtual ~IDeviceCreator(){
};
virtual IDevice * CreateAnalogDevice() = 0 ;
virtual IDevice * CreateDigitalDevice() = 0 ;
};
鉴于:CANalogDevice 和 CDigitalDevice 正在实现 IDevice
这是具体工厂类
class CDeviceCreator : public IDeviceCreator
{
public:
IDeviceCreator(){
}
virtual ~IDeviceCreator(){
}
virtual IDevice * CreateAnalogDevice(){
IDevice * anlogDev;
anlogDev = new CAnalogDevice();
return anlogDev;
}
virtual IDevice * CreateDigitalDevice(){
IDevice * digDev;
digDev = new CDigitalDevice();
return digDev;
}
};
最佳答案
您的方法 CDeviceCreator::CreateAnalogDevice 调用构造函数 CAnalogDevice。最有可能的是,真正的构造函数实际上不应该在单元测试期间被调用:可能它的使用会导致“烦恼”,例如a)引入硬件依赖性,从而使得无法在开发环境而不是目标上运行单元测试系统,b)如果相应的代码很大或者链接很多其他代码,则增加构建时间,c)可能库尚未完成或处于错误状态,d)...
出于这个原因,您希望将您的代码与这个真正的构造函数隔离开来,并使用替代品。您有几种实现隔离的可能性:
- 在单元测试中使用(肮脏的)预处理器技巧,例如 #defining CANalogDevice 到其他内容。
- 链接到您的测试特定的 CAnalogDevice 实现。此实现可以是一个模拟,但在这个简单的示例中,很可能更简单的东西(如 stub )也可以做到同样的效果。
总结:您不一定必须使用模拟,但很可能您必须采取一些措施来实现隔离。当然,这对于 CDigitalDevice 来说也是一样的。
还有一些您可能会发现有值(value)的其他建议:
您应该养成在定义时初始化值的习惯。也就是说,而不是写
IDevice * digDev; digDev = new CDigitalDevice();
更喜欢
IDevice * digDev = new CDigitalDevice();
有些人(包括我自己)喜欢在任何地方使用 const。例如,在更改初始化后如上所示:
IDevice * const digDev = new CDigitalDevice();
关于c++ - 需要一个好的方法来在 Google Test 中测试工厂类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35350332/