2016-02-11 54 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