2012-09-16 99 views
1

我創建了一個類,其中有一些新的操作符在構造函數中。我已經在構造函數中創建了守衛來管理新的操作失敗,但現在我想測試它。測試新的操作員失敗

作爲例子,我有一個構造是這樣的:

Function::Function() 
{ 
    try 
    { 
    m_pxArgument = new Argument(); 
    } 
    catch(std::bad_alloc) 
    { 
    throw MemoryException(); 
    } 
} 

是否有可能創建一個測試中,我可以告訴new操作符失敗,測試我抓碼?

+0

我不是專家程序員,但我認爲最好在構造函數之外使用'try' ... – 2012-09-16 09:27:35

+0

'Argument'是你的類/結構嗎? – PiotrNycz

+0

這只是一個例子,但try語句必須留在裏面,因爲真正的類更復雜,我想處理特定於庫的異常。在這種情況下,std :: bad_alloc是一個有效的異常,但在我看來,它是由內部管理引發的並不好。用戶必須對類內部沒有任何瞭解,所以對於內部異常也是如此。 – Jepessen

回答

4

如果Argument是您的類/結構體 - 那麼在此類中定義operator new僅用於UT目的。

class Argument { 
//... 
#ifdef UNIT_TEST 
    static bool& failNew() { static bool failNew = false; return failNew; } 
    void* operator new(size_t size) 
    { 
     if (!failNew()) 
     return ::operator new (size); 
     failNew() = false;  
     throw std::bad_alloc("Argument"); 
    } 
#endif 
}; 

每次需要失敗時,只需設置Argument::failNew() = true;

+0

謝謝,這是一個很好的建議。我會嘗試一下,如果它適合我​​,我會告訴你。 – Jepessen

1

要做這樣的測試,您需要爲class Argument重載operator new,然後提供一個在您的測試用例中引發的定義。但是,由於在運行時無法輕鬆交換,您可能需要單獨的測試程序。

如果你是我的C++學生,我首先會問,爲什麼你使用new和a可能是「裸」指針成員變化無論如何。第一個選擇是創建一個類型爲Argument的成員變量,並跳過顯式的堆分配。如果你真的需要在現代的代碼動態分配,我建議使用shared_ptr<Argument>和 功能::()函數:m_pxArgument(make_shared()){}

第二個問題我想問一下,就是爲什麼你要將std::bad_alloc翻譯成您自己的異常類型,如果需要在構造函數中完成。 std::bad_alloc是您實際遇到的情況的標準化例外情況,如果發生這種情況,生活通常很糟糕,您的小過程無法恢復很多(請參閱Charles Weir和James Noble的模式「Oates上尉」)。

+0

嗨。起初,如我所說,這只是一個例子。我真正的班級有點複雜,需要新的操作員。但我會檢查share_ptr,感謝這個建議。對於你的第二個回覆,我想這樣做是因爲我想爲庫提供統一的異常管理,在這種情況下,我認爲首選通用內存異常是因爲它沒有提供關於內部實現的細節,隨着時間的推移。 – Jepessen