2016-10-17 19 views
2

Google Mock documentation說:交織EXPECT_CALL()S和調用模擬功能

重要提示:谷歌模擬需要的預期要設置被稱爲模擬功能之前,否則該行爲是undefined。特別是,你不能交錯EXPECT_CALL()和調用模擬函數。

有沒有人知道這個限制背後的任何細節?然而,我有許多單元測試肯定違反了這個規則,但似乎正常工作。

回答

0

正如文檔所說,重要的是在調用方法之前設置期望值。但是,這並不意味着 它不可能交錯EXPECT_CALL和調用模擬方法。例如,假設我們有以下的模擬 類

class MyMock : public bravo::IRealClass 
{ 
public: 
    ... 
    MOCK_METHOD1(myMethod, bool(int)); 
    ... 
} 

現在,假設對方法的調用testMethod調用myMethod一次,你可以寫這樣的一個測試:

TEST(FooTest, testCaseName) 
{ 
    MyMock myMockObj; 
    ... 
    EXPECT_CALL(myMockObj, myMethod(_)).WillOnce(Return(true)); 
    testMethod(); 
    ASSERT_THAT(...); 

    EXPECT_CALL(myMockObj, myMethod(_)).WillOnce(Return(false)); 
    testMethod(); 
    ASSERT_THAT(...); 
} 

這將沒有問題,因爲沒有電話myMethod沒有設定的期望。但是,如果你要切換的第二 EXPECT_CALLtestMethod地的僞上述

EXPECT_CALL(myMockObj, myMethod(_)).WillOnce(Return(true)); 
testMethod(); 
ASSERT_THAT(...); 

testMethod(); 
EXPECT_CALL(myMockObj, myMethod(_)).WillOnce(Return(false)); 
ASSERT_THAT(...); 

你進入未定義行爲的境界。在未定義的行爲中總會出現這種情況,在某些情況下它可能不會崩潰 。但是,如果你的代碼中有這樣的東西,你必須改變它。