Google Mock: Nadpisanie EXPECT_CALL
-a
EXPECT_CALL jest nienadpisywalny. Nie oznacza to, 偶e nie mo偶na mie膰 kilku EXPECT_CALL
-贸w na t臋 sam膮 funkcj臋.
PRZYK艁AD 1
EXPECT_CALL(myMock, myMethod(1));
EXPECT_CALL(myMock, myMethod(2));
W te艣cie b臋d膮 obowi膮zywa艂y oba EXPECT_CALL
-e. Test przejdzie tylko wtedy, kiedy funkcja myMethod
zostanie wywo艂ana raz z argumentem 1
i raz z argumentem 2
. Kolejno艣膰 tych wywo艂a艅 nie ma znaczenia.
Test sfailuje gdy:
- Funkcja
myMethod
zostanie wywo艂ana 2 razy z argumentem1
lub2
. - Funkcja
myMethod
zostanie wywo艂ana z argumentem innym ni偶1
i2
.
PRZYK艁AD 2
EXPECT_CALL(myMock, myMethod(_));
EXPECT_CALL(myMock, myMethod(1));
W te艣cie b臋d膮 obowi膮zywa艂y oba EXPECT_CALL
-e i ka偶dy z nich musiy by膰 spe艂niony dok艂adnie raz. Trzeba jednak uwa偶a膰, bo EXPECT_CALL
-e s膮 dopasowywane w kolejno艣ci odwrotnej do pojawienia si臋 w kodzie. Czyli:
- Najpierw nast膮pi pr贸ba dopasowania
myMethod(1)
. - Je艣li dopasowanie si臋 nie uda, to nast膮pi pr贸ba dopasowania
myMethod(_)
.
Zatem dwukrotne wywo艂anie funkcji myMethod(1)
spowoduje b艂膮d, bo drugi EXPECT_CALL
zostanie dopasowany i spe艂niony 2 razy. Test przejdzie tylko wtedy, kiedy funkcja myMethod
zostanie wywo艂ana 2 razy, raz z argumentem 1
i raz z argumentem innym ni偶 1
. Kolejno艣膰 tych wywo艂a艅 nie ma znaczenia.
PRZYK艁AD 3
EXPECT_CALL(myMock, myMethod(1));
EXPECT_CALL(myMock, myMethod(_));
W te艣cie b臋d膮 obowi膮zywa艂y oba EXPECT_CALL
-e, ale ten pierwszy nigdy nie zostanie spe艂niony, bo w pierwszej kolejno艣ci zawsze sprawdzany b臋dzie myMethod(_)
, kt贸ry pasuje do wszystkiego.
W szczeg贸lno艣ci, test sfailuje gdy:
- Funkcja
myMethod
zostanie wywo艂ana raz. Mamy 2EXPECT_CALL
-e do spe艂nienia, wi臋c musz膮 by膰 dok艂adnie 2 wywo艂ania. - Funkcja
myMethod
zostanie wywo艂ana 2 razy z dwoma dowolnymi argumentami. Oba wywo艂ania zostan膮 dopasowane do drugiegoEXPECT_CALL
-a. Pierwszy nie zostanie spe艂niony (fail), a drugi zostanie spe艂niony podw贸jnie (fail).
PRZYK艁AD 4
EXPECT_CALL(myMock, myMethod(1));
EXPECT_CALL(myMock, myMethod(_)).RetireOnSaturation();
W te艣cie b臋d膮 obowi膮zywa艂y oba EXPECT_CALL
-e. Najpierw nast膮pi pr贸ba dopasowania tego drugiego (zawsze sprawdzamy od ko艅ca) i gdy zostanie on spe艂niony, to przestanie obowi膮zywa膰. Od tego momentu aktywny b臋dzie jedynie pierwszy EXPECT_CALL
na funkcj臋 myMethod(1)
.
Test przejdzie gdy:
- Funkcja
myMethod
zostanie wywo艂ana 2 razy, pierwszy raz z dowolnym argumentem i drugi raz z argumentem1
.
Test sfailuje gdy:
- Funkcja
myMethod
zostanie wywo艂ana tylko 1 raz lub wi臋cej ni偶 2 razy. - Funkcja
myMethod
zostanie wywo艂ana 2 razy, pierwszy raz z dowolnym argumentem i drugi raz z argumentem innym ni偶1
.
PRZYK艁AD 5
EXPECT_CALL(myMock, myMethod(_));
EXPECT_CALL(myMock, myMethod(1)).RetireOnSaturation();
W te艣cie b臋d膮 obowi膮zywa艂y oba EXPECT_CALL
-e. Najpierw nast膮pi pr贸ba dopasowania tego drugiego (zawsze sprawdzamy od ko艅ca) i gdy zostanie on spe艂niony, to przestanie obowi膮zywa膰.
Test przejdzie gdy:
- Funkcja
myMethod
zostanie wywo艂ana 2 razy, pierwszy raz z argumentem5
i drugi raz z argumentem1
. - Funkcja
myMethod
zostanie wywo艂ana 2 razy, pierwszy raz z argumentem1
i drugi raz z argumentem5
. - Funkcja
myMethod
zostanie wywo艂ana 2 razy, pierwszy raz z argumentem1
i drugi raz z argumentem1
.
Test sfailuje gdy:
- Funkcja
myMethod
zostanie wywo艂ana tylko 1 raz lub wi臋cej ni偶 2 razy. - Funkcja
myMethod
zostanie wywo艂ana 2 razy z argumentem innym ni偶1
.
Zauwa偶, 偶e gdyby usun膮膰 .RetireOnSaturation()
, to test przesta艂by przechodzi膰 dla przypadku wywo艂ania myMethod
dwa razy z argumentem 1
, bo oba wywo艂ania dopasowa艂yby si臋 do drugiego, wiecznie aktywnego, EXPECT_CALL
-a powoduj膮c fail.
PRZYK艁AD 6
EXPECT_CALL(myMock, myMethod(1));
EXPECT_CALL(myMock, myMethod(1));
Powy偶szy test nigdy nie przejdzie, bo ka偶de wywo艂anie myMethod(1)
b臋dzie zawsze dopasowywane do drugiego EXPECT_CALL
-a.
EXPECT_CALL(myMock, myMethod(1));
EXPECT_CALL(myMock, myMethod(1)).RetireOnSaturation();
Teraz test przejdzie jak dwa razy wywo艂amy myMethod(1)
. Po pierwszym dopasowaniu drugi EXPECT_CALL
stanie si臋 nieaktywny i dopasujemy si臋 do tego pierwszego. Powy偶szy kod jest r贸wnowa偶ny u偶yciu Times(2)
:
EXPECT_CALL(myMock, myMethod(1)).Times(2);