2016-02-11 77 views
2

我是新的谷歌测试,对C++来说相对较新。看下面的简化示例,测试CDeviceCreator的一般方法是什么?我需要一个模拟吗?我已经阅读了谷歌测试中的嘲笑,但很难理解它。你能否提供一个具体的案例。提前致谢。需要一个很好的方法来测试Google测试中的工厂类

这是工厂类

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; 
    } 
}; 

回答

3

你的方法CDeviceCreator :: CreateAnalogDevice调用构造函数CAnalogDevice。最有可能的是,真正的构造函数不应该在你的单元测试中被实际调用:可能它的使用会导致“烦恼”,例如:a)引入硬件依赖关系,从而无法在开发环境而不是目标上运行单元测试系统,b)如果相应的代码很大或者再次链接很多其他代码,则增加构建时间,c)库可能尚未完成或者处于越野状态,d)...

对于这个原因,你想从这个真正的构造函数中分离你的代码,并使用替换。你有几种可能性实现隔离:

  • 使用(脏)预处理技巧,如#defining CAnalogDevice到单元测试中的其他东西。
  • 链接您的测试具体实现CAnalogDevice。这个实现可能是一个模拟,但在这个简单的例子中,很可能更简单一些(比如存根)也可以。

总结:你不一定非要使用模拟,但很有可能你将不得不做一些事情来实现隔离。而且,这一切对于CDigitalDevice来说都是一样的。

有一些额外的建议你可能会发现有价值的:

  • 你应该养成习惯在定义点初始化值。也就是说,不是写

    IDevice * digDev; 
    digDev = new CDigitalDevice(); 
    

    ,喜欢

    IDevice * digDev = new CDigitalDevice(); 
    
  • 有些人(包括我自己)都喜欢用const的只是无处不在。例如,将改变初始化后如上图所示:

    IDevice * const digDev = new CDigitalDevice(); 
    
+0

感谢您的反馈。你说得对,用真正的构造函数创建硬件依赖关系。至少对于我的具体情况。 – MIbrah

相关问题