2016-10-06 70 views
1

我是一個很長時間潛伏在董事會,不用說,你們是最好的,我很感謝你保存我的工作的所有時間。這是我第一次在這裏發帖,我希望我不要搞砸了。海龜模擬:MOCK_EXPECT失敗,如果模擬類方法返回一個值

我正在爲Linux(虛擬化Ubuntu 16.04 amd_64)編寫一個C++ Boost應用程序,並且正在使用Turtle Mock進行模擬框架和測試框架的Boost測試。當我嘗試測試使用依賴注入技術的類時,我嘲笑需要提供給測試類的類,以便我可以驗證它們的調用順序。非常好,但問題來了。 我正在使用MOCK_BASE_CLASS(MockAClass,AClass)覆蓋真實AClass的虛擬方法,並使用新的MockAClass繼續我的測試。假設在設置MockAClass對象的getTest方法的期望值和返回值並調用該方法後,AClass有一個虛擬方法int getTest(int),並且MockAClass具有MOCK_METHOD(getTest,1,int(int)),在大多數情況下是MOCK_EXPECT(objMockAClass.getTest).at_least(1)從未驗證過。我可以控制返回值,但呼叫從未被驗證過。這隻發生在函數返回一個值(例如,如果函數是void getTest(int),那麼驗證通過)。

我附上一個簡單的PoC我的問題,將在我的系統上失敗。

class AClass 
{ 
public: 
virtual int getTest(int a) {return 0} 
} 

MOCK_BASE_CLASS (MockAClass, AClass) 
{ 
MOCK_METHOD(getTest, 1, int(int)); 
} 

BOOST_AUTО_TEST_CASE(SomeClassFunctionality) 
{ 

MockAClass objMockAClass; 

MOCK_EXPECT(objMockAClass.getTest).returns(1); 
MOCK_EXPECT(objMockAClass.getTest).at_least(1); 
objMockAClass.getTest(1); 

} 

回答

0
MOCK_EXPECT(objMockAClass.getTest).returns(1); 
MOCK_EXPECT(objMockAClass.getTest).at_least(1); 

這實際上是兩個預期。第一個意思是'每次getTest被調用返回1',第二個'getTest必須被調用至少一次'。 問題是,第一個將永遠匹配,因此第二個將沒有機會被觸發。

+0

是的,這是正確的。它將它們作爲兩個單獨的互斥語句來處理,這就是它失敗的原因。謝謝你的支持。 :) –

0

如果在一個完整的EXPECT語句中組合了單獨的EXPECT語句,問題就解決了。

MOCK_EXPECT(objMockAClass.getTest).at_least(1).returns(1); - 這將使示例按計劃運行。

問候,