2012-12-18 338 views
30

我不明白ON_CALL和EXPECT_CALL之間的區別,當使用它時 指定默認動作。gmock設置默認動作/ ON_CALL與EXPECT_CALL

到目前爲止,我注意到/瞭解到有兩種方法來調整模擬的默認操作:

ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01)); 

EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01)); 

有人能向我解釋:

  • 兩種方法的區別
  • 起起落落每一個
  • 什麼時候適合使用它們(什麼裝備......)

回答

29

有兩種說法之間微妙而顯著的差異。 EXPECT_CALL設置模擬電話的期望值。寫

EXPECT_CALL(mock, methodX(_)).WillRepeatedly(do_action); 

告訴gMock是methodX可在mock被稱爲有任何參數任意次數,並且當它是,mock將執行do_action。在另一方面,

ON_CALL(mock, methodX(_)).WillByDefault(do_action); 

告訴gMock,每當methodXmock調用時,它應該執行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。在這種情況下,第一個期望將被完全忽略。

7
ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01)); 
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01)); 

正如你所說,這兩條線都在做同樣的事情,因此不存在差異在所有。您可以使用任一種方式設置默認操作。

然而,有一個合乎邏輯的區別:

  • ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));意味着該方法可能會被調用,如果出現這種情況,每次調用將返回0×01
  • EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01));意味着它預計方法被調用,並且每次調用將返回0×01

順便說一句,有他們的一章Setting default actions吃片,它說:

要定製一個特定方法的默認操作,使用ON_CALL():

ON_CALL(mock_object, method(matchers)) 
    .With(multi_argument_matcher) ? 
    .WillByDefault(action); 
+0

但似乎當我嘗試覆蓋之前使用ON_CALL定義的EXPECT_CALL的默認操作時,它不起作用。任何想法? – Nicoretti

+2

@Nicoretti不,它不起作用。我甚至不確定如果你們兩個都設置了會發生什麼。也許在這種情況下只有一個被執行。順便提一下,gtest有一個[部分](http://code.google.com/p/googlemock/wiki/CheatSheet#Setting_Default_Actions)解釋瞭如何設置默認行爲。 –

+0

耶看到這一個,但我很好奇和困惑,因爲可以使用EXPECT_CALL來修改默認行爲。而且,在使用這兩種方法時,文檔沒有提及任何有關副作用/優先級的內容。 – Nicoretti