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:

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:

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:

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:

Test sfailuje gdy:

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:

Test sfailuje gdy:

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);

Zobacz r贸wnie偶