有兩種說法之間微妙而顯著的差異。 EXPECT_CALL
設置模擬電話的期望值。寫
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(do_action);
告訴gMock是methodX
可在mock
被稱爲有任何參數任意次數,並且當它是,mock
將執行do_action
。在另一方面,
ON_CALL(mock, methodX(_)).WillByDefault(do_action);
告訴gMock,每當methodX
上mock
調用時,它應該執行do_action
。這個功能對於你必須在你的模擬中寫下很多期望的場景很有幫助,並且大部分/全部都必須指定相同的動作 - 尤其是在複雜的情況下。您可以在ON_CALL
中指定該操作,然後編寫EXPECT_CALL
s,而無需明確指定操作。例如。,
ON_CALL(mock, Sign(Eq(0), _))
.WillByDefault(DoAll(SetArgPointee<1>("argument is zero"), Return(0)));
ON_CALL(mock, Sign(Gt(0), _))
.WillByDefault(DoAll(SetArgPointee<1>("argument is positive"), Return(1)));
ON_CALL(mock, Sign(Lt(0), _))
.WillByDefault(DoAll(SetArgPointee<1>("argument is negative"), Return(-1)));
現在,如果你寫了很多EXPECT_CALL
S,你不必mock
的指定行爲每次:
EXPECT_CALL(mock, Sign(-4, _));
EXPECT_CALL(mock, Sign(0, _));
EXPECT_CALL(mock, Sign(1, _)).Times(2);
EXPECT_CALL(mock, Sign(2, _));
EXPECT_CALL(mock, Sign(3, _));
EXPECT_CALL(mock, Sign(5, _));
在另一個例子中,假設SIGN返回int
,如果你寫
ON_CALL(mock, Sign(Gt(0), _)).WillByDefault(Return(1));
EXPECT_CALL(mock, Sign(10, _));
通話mock.Sign(10)
將返回1爲ON_CALL
爲默認行爲的呼叫由EXPECT_CALL
指定。但是,如果你寫
EXPECT_CALL(mock, Sign(Gt(0), _).WillRepeatedly(Return(1));
EXPECT_CALL(mock, Sign(10, _));
的mock.Sign(10, p)
調用將返回0它將對第二個期望相匹配。該期望沒有指定明確的操作,gMock將爲其生成默認操作。該默認操作是返回返回類型的默認值,對於int
爲0。在這種情況下,第一個期望將被完全忽略。
但似乎當我嘗試覆蓋之前使用ON_CALL定義的EXPECT_CALL的默認操作時,它不起作用。任何想法? – Nicoretti
@Nicoretti不,它不起作用。我甚至不確定如果你們兩個都設置了會發生什麼。也許在這種情況下只有一個被執行。順便提一下,gtest有一個[部分](http://code.google.com/p/googlemock/wiki/CheatSheet#Setting_Default_Actions)解釋瞭如何設置默認行爲。 –
耶看到這一個,但我很好奇和困惑,因爲可以使用EXPECT_CALL來修改默認行爲。而且,在使用這兩種方法時,文檔沒有提及任何有關副作用/優先級的內容。 – Nicoretti