2
的Google Mock documentation說:交織EXPECT_CALL()S和調用模擬功能
重要提示:谷歌模擬需要的預期要設置被稱爲模擬功能之前,否則該行爲是undefined。特別是,你不能交錯EXPECT_CALL()和調用模擬函數。
有沒有人知道這個限制背後的任何細節?然而,我有許多單元測試肯定違反了這個規則,但似乎正常工作。
的Google Mock documentation說:交織EXPECT_CALL()S和調用模擬功能
重要提示:谷歌模擬需要的預期要設置被稱爲模擬功能之前,否則該行爲是undefined。特別是,你不能交錯EXPECT_CALL()和調用模擬函數。
有沒有人知道這個限制背後的任何細節?然而,我有許多單元測試肯定違反了這個規則,但似乎正常工作。
正如文檔所說,重要的是在調用方法之前設置期望值。但是,這並不意味着 它不可能交錯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_CALL
和testMethod
地的僞上述
EXPECT_CALL(myMockObj, myMethod(_)).WillOnce(Return(true));
testMethod();
ASSERT_THAT(...);
testMethod();
EXPECT_CALL(myMockObj, myMethod(_)).WillOnce(Return(false));
ASSERT_THAT(...);
你進入未定義行爲的境界。在未定義的行爲中總會出現這種情況,在某些情況下它可能不會崩潰 。但是,如果你的代碼中有這樣的東西,你必須改變它。