Close Menu
    Ciekawe

    Jak podłączyć telefon do monitora? Przewodowe i bezprzewodowe sposoby

    2025-12-08

    Co można wrzucić w koszty firmy jednoosobowej? Lista i praktyczne przykłady

    2025-12-03

    Jak podłączyć okulary VR do PS4? Poradnik podłączenia i konfiguracji

    2025-12-02
    Facebook X (Twitter) Instagram
    CPP Polska
    Facebook X (Twitter) Instagram
    • Biznes

      Co można wrzucić w koszty firmy jednoosobowej? Lista i praktyczne przykłady

      2025-12-03

      Jak zapobiec wyciekom danych firmowych?

      2025-11-28

      Ile kosztuje prowadzenie jednoosobowej działalności gospodarczej? Przegląd opłat

      2025-11-10

      Jak wziąć samochód w leasing bez firmy? Poradnik dla osób fizycznych

      2025-10-29

      Jak założyć firmę jednoosobową krok po kroku – koszty, formalności i czas trwania

      2025-10-23
    • Technologie

      Jak podłączyć telefon do monitora? Przewodowe i bezprzewodowe sposoby

      2025-12-08

      Jak podłączyć okulary VR do PS4? Poradnik podłączenia i konfiguracji

      2025-12-02

      Jak zapobiec wyciekom danych firmowych?

      2025-11-28

      Jak sprawdzić rozdzielczość monitora w Windows i macOS?

      2025-11-26

      Jak zresetować laptopa Acer do ustawień fabrycznych? Poradnik krok po kroku

      2025-11-25
    • Programowanie

      Maszyna stanów oparta o std::variant

      2025-10-07

      Tablice w C++ od podstaw – deklaracja, inicjalizacja, iteracja i typowe pułapki

      2025-10-07

      std::deque w C++ – kiedy wybrać dwukierunkową kolejkę zamiast vectora

      2025-10-07

      itoa i std::to_chars – konwersja liczb na tekst bez narzutu wydajności

      2025-10-07

      strcpy vs strncpy vs std::string – bezpieczne kopiowanie łańcuchów w C++

      2025-10-07
    • Inne

      Jak prowadzić blog programistyczny i dzielić się wiedzą?

      2025-06-28
    CPP Polska
    Home»C++»Google Mock: cardinality, matcher, action w praktyce
    C++

    Google Mock: cardinality, matcher, action w praktyce

    Oskar KlimkiewiczBy Oskar KlimkiewiczUpdated:2025-06-28Brak komentarzy5 Mins Read
    Share Facebook Twitter LinkedIn Email Copy Link
    Follow Us
    RSS
    A group of people sitting in a room with a checkered floor
    Share
    Facebook Twitter LinkedIn Email Copy Link

    Kompleksowa eksploracja Google Mock – cardinality, matchers i actions w praktyce

    Google Mock (gMock) to kluczowy komponent frameworka GoogleTest, umożliwiający zaawansowane testowanie jednostkowe przy użyciu obiektów pozornych. Artykuł ten stanowi pogłębioną analizę trzech podstawowych koncepcji gMock – cardinality, matchers i actions – prezentując praktyczne wskazówki implementacyjne. Bazując na oficjalnej dokumentacji oraz przykładach z rzeczywistych wdrożeń, analizujemy funkcjonalności każdego z elementów, ich wzajemne zależności oraz niuanse ich zastosowania.

    1. Wprowadzenie do podstaw gMock

    gMock wspiera testowanie oparte na zachowaniu poprzez symulowanie zależności za pomocą obiektów mokowanych. Pozwala to programistom na:

    • Definiowanie oczekiwań (np. liczba wywołań funkcji, wartości argumentów);
    • Określanie zachowań (np. zwracane wartości, skutki uboczne);
    • Walidację interakcji (np. sekwencje wywołań, liczba wywołań).
      Struktura EXPECT_CALL stanowi podstawową składnię konfigurowania moków, łącząc cardinality, matchers i actions w jednolitą deklarację. Przykład:

      
      EXPECT_CALL(mock_object, method(matchers))
          .Times(cardinality)
          .WillOnce(action)
          .WillRepeatedly(action);
      

      Ten schemat umożliwia precyzyjną kontrolę zachowania obiektów pozornych, przekształcając testy jednostkowe w ekspresyjne specyfikacje działania systemu.

    2. Cardinality – ilościowe określenie oczekiwań

    Cardinality definiuje, jak często dana funkcja mokowana powinna być wywołana, co określamy za pomocą klauzuli Times(). gMock obsługuje zarówno jawne, jak i rozmyte cardinalities, dostosowując się do różnorodnych scenariuszy testowych.

    2.1 Jawne cardinalities

    • Times(n) – dokładna ilość wywołań;
    
    EXPECT_CALL(turtle, GetX()).Times(3); // Funkcja musi być wywołana dokładnie 3 razy
    
    • Times(0) – blokuje wywołania (równoważne z Never()).

    2.2 Przybliżone cardinalities

    • AtLeast(n) – minimum n wywołań;
    • AtMost(n) – maksimum n wywołań;
    • Between(m, n) – liczba wywołań w przedziale od m do n (włącznie);
    • AnyNumber() – brak ograniczeń liczby wywołań.

    2.3 Zasady domyślnego cardinality

    Jeżeli nie zastosujemy Times(), gMock domyślnie określa cardinality na podstawie klauzul akcji:

    • brak działań: Times(1) (jedno wywołanie);
    • tylko WillOnce(): Times(n) (po jednym wywołaniu dla każdego WillOnce);
    • WillOnce() + WillRepeatedly(): Times(AtLeast(n)) (minimum n wywołań);

    Przykład:

    
    EXPECT_CALL(turtle, GetY())
        .WillOnce(Return(100))
        .WillOnce(Return(200))
        .WillRepeatedly(Return(300));
    

    gMock wywnioskuje AtLeast(2) wywołania: dwa pierwsze zwracają odpowiednio 100 i 200, kolejne – 300.

    Typowy błąd: Nadpisanie Times() wyłącza domniemaną liczność. Jeżeli określimy Times(4) i podamy tylko dwa WillOnce(), ostatnie dwa wywołania wykonają domyślne działanie mokowanej metody.

    3. Matchers – walidacja argumentów

    Matchers pozwalają weryfikować argumenty przekazywane do mokowanych funkcji, umożliwiając precyzyjną kontrolę oczekiwanych wartości lub warunków.

    3.1 Wbudowane matchers

    • Matchers wartości – porównują argumenty do oczekiwanych wartości;
    
    EXPECT_CALL(foo, Bar(Eq(5)));   // Argument musi być równy 5
    EXPECT_CALL(foo, Bar(Gt(10))); // Argument > 10
    
    • Matchers kontenerów – porównują zawartość, strukturę lub elementy;
    
    EXPECT_CALL(foo, Process(ElementsAre(1, Lt(0), _, 5))); // 4 argumenty: 1, liczba ujemna, dowolny, 5
    

    3.2 Matchers złożone (Composite)

    Kombinujemy matchers za pomocą operatorów logicznych:

    • AllOf(m1, m2) – wszystkie warunki muszą być spełnione;
    • AnyOf(m1, m2) – wystarczy spełnienie jednego warunku;
    • Not(m) – neguje matcher.

    Przykład:

    
    using ::testing::AllOf;
    using ::testing::Lt;
    EXPECT_CALL(foo, Blah)
        .With(AllOf(Args<0, 1>(Lt()), Args<1, 2>(Lt())));
    

    Wymaga, aby argumenty były w relacji 0 < 1 < 2.

    3.3 Matchers polimorficzne

    • _ – pasuje do dowolnego argumentu (z zachowaniem typów);
    
    EXPECT_CALL(foo, Bar(_)); // Dowolny pojedynczy argument
    
    • Własny predykat – własna funkcja warunkowa;
    
    EXPECT_CALL(foo, Bar(Truly([](int x){ return x % 2 == 0; })));
    

    4. Actions – definiowanie zachowania mocka

    Actions definiują, co wykonuje mokowana funkcja, np. zwracanie wartości, wywołania zwrotne czy zmiany stanu.

    4.1 Wbudowane actions

    • Zwracanie wartości;
    
    .WillOnce(Return(42))
    .WillRepeatedly(Return(0));
    
    • Efekty uboczne;
    
    .WillOnce(Invoke([](){ WriteLog("Wywołano!"); }));
    
    • Manipulacja argumentami;
    
    using ::testing::SetArgPointee;
    EXPECT_CALL(weather_station, wind(_, _))
        .WillOnce(DoAll(SetArgPointee<0>(North), SetArgPointee<1>(0.5)));
    

    4.2 Sekwencjonowanie actions

    • WillOnce() – definiuje zachowanie dla kolejnego wywołania;
    • WillRepeatedly() – definiuje zachowanie dla wszystkich kolejnych wywołań.

    Przykład:

    
    EXPECT_CALL(turtle, GetZ())
        .WillOnce(Return(50))
        .WillOnce(Return(60))
        .WillRepeatedly(Return(70));
    

    1. wywołanie: 50, drugie: 60, kolejne: 70.

    4.3 Własne akcje (Custom actions)

    • Makro ACTION() – pozwala na definiowanie własnych działań;
    
    ACTION(Sum) { return arg0 + arg1; }
    EXPECT_CALL(calc, Add).WillRepeatedly(Sum());
    
    • Akcje parametryzowane;
    
    ACTION_P(Add, n) { return arg0 + n; }
    EXPECT_CALL(calc, Add).WillOnce(Add(5));
    

    5. Przykłady praktyczne – integracja w testach

    5.1 Mockowanie systemu paliwowego

    
    class Car {
    public:
        virtual void addFuel(double amount) = 0;
    };
    class MockCar : public Car {
    public:
        MOCK_METHOD(void, addFuel, (double amount), (override));
    };
    
    
    TEST(CarTest, FuelAdditions) {
        MockCar c;
        EXPECT_CALL(c, addFuel(Gt(5.0)))
            .Times(Between(1, 3))
            .WillRepeatedly(Invoke([](double amt){ /* ... */ }));
    }
    
    • addFuel wywołane 1–3 razy,
    • argument zawsze > 5.0,
    • wykonywana własna logika przy każdym wywołaniu.

    5.2 Testowanie callbacków

    
    using ::testing::MockFunction;
    using ::testing::_;
    
    
    TEST(CallbackTest, StdFunction) {
        MockFunction mock_callback;
        auto callback = mock_callback.AsStdFunction();
    
        EXPECT_CALL(mock_callback, Call(_))
            .Times(2)
            .WillOnce(Return(10))
            .WillOnce(Return(20));
    
        callback("test"); // Zwraca 10
        callback("test"); // Zwraca 20
    }
    

    Wykorzystuje MockFunction do weryfikacji wywołań std::function.

    6. Zaawansowane wzorce

    6.1 Kolejność oczekiwań

    • InSequence – wymusza sekwencyjność oczekiwań;
    • After – ustala zależności między oczekiwaniami.
    
    using ::testing::Expectation;
    Expectation init = EXPECT_CALL(obj, Init());
    EXPECT_CALL(obj, Execute())
        .After(init);
    

    6.2 Obsługa nasycenia (saturation)

    • RetiresOnSaturation() – wyłącza oczekiwanie po osiągnięciu jego cardinality.
    
    EXPECT_CALL(obj, Method(_))
        .Times(AnyNumber())
        .RetiresOnSaturation();
    

    7. Podsumowanie

    Cardinality, matchers i actions wspólnie umożliwiają tworzenie ekspresywnych, łatwych w utrzymaniu testów jednostkowych w gMock:

    • Cardinality zapewnia, że funkcje są wywoływane prawidłową liczbę razy, eliminując niedopatrzenia lub nadmiary;
    • Matchers umożliwiają precyzyjną weryfikację argumentów i ograniczanie fałszywych pozytywów;
    • Actions oddzielają konfigurację testu od implementacji szczegółów.

    Zalecane praktyki –

    • Preferuj domyślne mechanizmy cardinality, gdy to możliwe;
    • Kombinuj matchers za pomocą AllOf/AnyOf w złożonej walidacji;
    • Stosuj makra ACTION* do definiowania wielokrotnego, niestandardowego zachowania.

    Opanowanie tych koncepcji zmienia testy jednostkowe w żywą dokumentację, zwiększa niezawodność kodu i przyspiesza rozwój oprogramowania. W przyszłości warto zagłębić się m.in. w mockowanie wielowątkowe czy integrację z frameworkami do testów właściwościowych.

    Artykuł powstał na bazie dokumentacji gMock, praktycznych samouczków oraz doświadczenia z rzeczywistych projektów.

    Polecane:

    • Podstawy pracy z Google Mock – kurs krok po kroku
    • Google Mock – definiowanie zachowań i oczekiwań
    • Referencje uniwersalne i std::forward – zarządzanie zasobami
    • Krótki tutorial menedżera pakietów Conan
    • Historia wyrażeń lambda w C++ od C++03 do C++20
    Share. Facebook Twitter LinkedIn Email Copy Link
    Oskar Klimkiewicz
    • Website

    Inżynier oprogramowania specjalizujący się w C++, absolwent Wydziału Elektroniki i Technik Informacyjnych Politechniki Warszawskiej. Od ponad 8 lat projektuje i rozwija systemy o wysokiej dostępności, głównie dla branży fintech i IoT. PS. Zdjęcie wyretuszowane przez AI :)

    Podobne artykuły

    Maszyna stanów oparta o std::variant

    8 Mins Read

    Tablice w C++ od podstaw – deklaracja, inicjalizacja, iteracja i typowe pułapki

    4 Mins Read

    std::deque w C++ – kiedy wybrać dwukierunkową kolejkę zamiast vectora

    4 Mins Read
    Leave A Reply Cancel Reply

    Oglądaj, słuchaj, ćwicz - zdobywaj nowe umiejętności online
    Nie przegap

    Jak podłączyć telefon do monitora? Przewodowe i bezprzewodowe sposoby

    Oskar Klimkiewicz6 Mins Read

    Podłączenie telefonu do monitora to jedna z najistotniejszych innowacji ery mobilnej, umożliwiająca przeniesienie doświadczeń z…

    Co można wrzucić w koszty firmy jednoosobowej? Lista i praktyczne przykłady

    2025-12-03

    Jak podłączyć okulary VR do PS4? Poradnik podłączenia i konfiguracji

    2025-12-02

    Jak zapobiec wyciekom danych firmowych?

    2025-11-28
    Social media
    • Facebook
    • Twitter
    • LinkedIn
    O nas
    O nas

    CPP Polska to serwis internetowy poświęcony technologii, programowaniu, IT, biznesowi i finansom. Znajdziesz tu porady, wskazówki i instrukcje dla wszystkich czytelników IT & Tech & Biz.

    Facebook X (Twitter) LinkedIn RSS
    Najnowsze

    Jak podłączyć telefon do monitora? Przewodowe i bezprzewodowe sposoby

    2025-12-08

    Co można wrzucić w koszty firmy jednoosobowej? Lista i praktyczne przykłady

    2025-12-03

    Jak podłączyć okulary VR do PS4? Poradnik podłączenia i konfiguracji

    2025-12-02
    Popularne

    Skrajnie niepotrzebne, skrajne przypadki w C++

    2025-06-28

    Wyszukiwanie testów w Google Test – metody i narzędzia

    2025-06-28

    Czy C jest wolniejszy od C++? Zero-cost abstraction w praktyce

    2025-06-28
    © 2025 CPP Polska. Wszelkie prawa zastrzeżone.
    • Lista publikacji
    • Współpraca
    • Kontakt

    Type above and press Enter to search. Press Esc to cancel.