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
myMethodzostanie wywo艂ana 2 razy z argumentem1lub2. - Funkcja
myMethodzostanie wywo艂ana z argumentem innym ni偶1i2.
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
myMethodzostanie wywo艂ana raz. Mamy 2EXPECT_CALL-e do spe艂nienia, wi臋c musz膮 by膰 dok艂adnie 2 wywo艂ania. - Funkcja
myMethodzostanie 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
myMethodzostanie wywo艂ana 2 razy, pierwszy raz z dowolnym argumentem i drugi raz z argumentem1.
Test sfailuje gdy:
- Funkcja
myMethodzostanie wywo艂ana tylko 1 raz lub wi臋cej ni偶 2 razy. - Funkcja
myMethodzostanie 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
myMethodzostanie wywo艂ana 2 razy, pierwszy raz z argumentem5i drugi raz z argumentem1. - Funkcja
myMethodzostanie wywo艂ana 2 razy, pierwszy raz z argumentem1i drugi raz z argumentem5. - Funkcja
myMethodzostanie wywo艂ana 2 razy, pierwszy raz z argumentem1i drugi raz z argumentem1.
Test sfailuje gdy:
- Funkcja
myMethodzostanie wywo艂ana tylko 1 raz lub wi臋cej ni偶 2 razy. - Funkcja
myMethodzostanie 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);