我是谷歌测试的新手,一般来说是C ++的新手。看一下下面的简化示例,测试CDeviceCreator的一般方法是什么?我是否一定需要模拟。我读过关于谷歌测试中的嘲笑,但很难理解它。能否请您提供一个特定于此案例的示例。提前致谢。
这是工厂类的接口
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;
}
};
答案 0 :(得分:3)
您的方法CDeviceCreator :: CreateAnalogDevice调用构造函数CAnalogDevice。最有可能的是,在单元测试期间实际上不应该调用真正的构造函数:可能它的使用会导致“烦恼”,例如a)引入硬件依赖性,从而使得无法在开发环境而不是目标上运行单元测试系统,b)如果相应的代码很大则增加构建时间,或者再次链接许多其他代码,c)可能库尚未完成或处于错误状态,d)......
出于这个原因,您希望将代码与此真实构造函数隔离开来,并使用替换代码。您有多种可能实现隔离:
总结:你不一定要使用模拟,但很可能你必须做一些事情才能实现隔离。当然,对于CDigitalDevice来说,这一切都是一样的。
您可能会发现一些有价值的其他建议:
您应该习惯在定义时初始化值。也就是说,而不是写
IDevice * digDev;
digDev = new CDigitalDevice();
喜欢
IDevice * digDev = new CDigitalDevice();
有些人(包括我自己)喜欢到处使用const。例如,在如上所示更改初始化之后:
IDevice * const digDev = new CDigitalDevice();