2014-10-10 21 views
0

就編譯器而言,Hippomocks的MockRepository支持多個實例。但是,有些用例是不可能的,因爲它們會導致單元測試可執行的崩潰。我們來考慮下面的例子。MockRepository可能存在多個共存實例嗎?如果是在哪些條件下?

void MyCall() 
{ 
} 

void MyCall2() 
{ 
} 

void MySubTest() 
{ 
    MockRepository mockRep2; 
    mockRep2.ExpectCallFunc(MyCall2); 

    MyCall2(); 
} 

void MyTest() 
{ 
    MockRepository mockRep1; 
    mockRep1.ExpectCallFunc(MyCall); 

    MySubTest(); 

    MyCall(); 
} 

本示例(在Visual C++ 2010中)導致未處理的異常(訪問衝突讀取位置0x00000048)。

  • 分析Hippomocks標題顯示此用例似乎並未預見(參見MockRepoInstanceHolder)。背後只允許一個實例的原因是什麼?
  • 我可以理解,例如MockRepository實例中的不同ExpectCallFunc可能與實例矛盾。這是它背後的原因嗎?
  • 我們可以通過將mockRep1實例移至MySubTest()調用之後解決問題,但我們很難第一時間理解問題。是否有編譯時或運行時可能性來明確識別這種多個實例?

回答

0

根本問題是(編譯時生成的)函數沒有地方'標記'它與一個特定的模擬存儲庫,不像模擬對象它不能生長攜帶它。這就是持有人的目的 - 從生成的存根函數中找到模擬存儲庫。

這聽起來像一個可解決的問題,如果有一個很好的用例,通過使該函數中生成的代碼更復雜一點。我必須承認,我沒有看到直接的直接優勢,特別是在兩個單獨的回購協議中嘲弄相同的功能兩次無法正常工作(因爲你很難覆蓋相同的功能),並且會導致很難調試問題,如果你在某個時候混淆他們。我不認爲增加的複雜性和調試困難與此增加的功能相比。

+0

感謝您的答案。我將其標記爲正確的答案,因爲我只是在索要背景信息而不是「bug」修復(這不過是一個設計決定而不是bug)。 – 2014-11-20 14:39:30

0

我遇到了同樣的問題。 使用cppunit作爲測試框架,我使MockRepository成爲測試框架類的成員。 如果有幾個測試用例,cppunit爲每個測試用例實例化一個新的測試框架類的對象。這將覆蓋MockRepositoryHolder。我在第一個測試用例中嘗試模擬Windows API函數時遇到了異常,但HippoMocks引用了最後一次寫入的MockRepository,如果是最後一個測試用例的話。 對我來說,一個解決方法是要麼MockRepository本地到每個測試用例或添加一個新的本地MockRepository僅用於嘲弄靜態函數

相關問題