2011-04-21 72 views
6

考慮某種模擬函數預期會被多次調用的情況,每次在某個參數中使用不同的值。我想驗證一下,函數在某個值列表(例如1,2,5)中確實被稱爲每個值一次且只有一次。Google Mock:對具有不同參數的相同函數的多重期望

另一方面,我想避免定義一個序列,因爲這將決定一個特定的順序,這是我想保留免費的實現細節。

這種情況下是否存在某種匹配器或其他解決方案?

我不確定這是否會以任何方式影響解決方案,但我打算在上面的列表中使用WillOnce(Return(x)),其值爲每個值不同的x。

回答

10

默認情況下,gMock的期望值可以以任何順序滿足(正因爲你提到的原因 - 所以你不要指定你的測試)。

在你的情況,你只是想是這樣的:

EXPECT_CALL(foo, DoThis(1)); 
EXPECT_CALL(foo, DoThis(2)); 
EXPECT_CALL(foo, DoThis(5)); 

而且是這樣的:

foo.DoThis(5); 
foo.DoThis(1); 
foo.DoThis(2); 

將滿足這些期望。

(旁白:如果您沒有想約束的順序,你應該使用InSequencehttps://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#expecting-ordered-calls

+0

我在寫這個問題時一定是分層次的。我會把它發佈給所有其他分層程序員:) – Jonathan 2011-05-06 11:47:41

+0

不能使EXPECT_CALL更緊湊嗎?例如:EXPECT_CALL(foo,DoThis(參數<1, 2, 5>)); ? – xwl 2016-11-11 08:41:38

0

如果你希望一個函數,DoThing,與許多不同的參數來調用,您可以使用以下圖案:

for (auto const param : {1, 2, 3, 7, -1, 2}{ 
    EXPECT_CALL(foo, DoThing(param)); 
} 

這是特別有幫助的,如果你的EXPECT_CALL包括許多參數,其中只有一個是變化的,或者如果你的EXPECT_CALL包括許多Action s到重複。

相關問題