Dummy, Fake, Stub i Mock w testach jednostkowych

Kiedy zaczynałem swoją przygodę z testami jednostkowymi nie widziałem żadnej różnicy między obiektami typu Dummy, Fake, Stub i Mock. Używałem każdego z nich bez świadomości istnienia jakichkolwiek różnic między nimi. Wszystkie cztery typy były dla mnie dokładnie tym samym – sztucznym obiektem stworzonym na potrzeby testów. Moja ignorancja i brak wiedzy prowadziły do kilku problemów:

  • frustracji w trakcie pisania testów wynikającego z niewiedzy (np. dlaczego ten test wyrzuca wyjątek a inny nie, itp.),
  • nieporozumień w trakcie dyskusji z kolegami z zespołu,
  • błędnego zrozumienia przeczytanych artykułów na temat testowania jednostkowego.

Podczas jednej z dyskusji jaką miałem z kolegą z zespołu doszło do pewnego nieporozumienia. On dokładnie znał różnice między czterema typami sztucznych obiektów, co nie do końca zgadzało się z moimi przekonaniami. Na szczęście potrafił w prosty i przystępny sposób wytłumaczyć mi wszystkie niejasności – za co jestem mu bardzo wdzięczny. Kolejny raz okazało się, że jest jeszcze tyle rzeczy, o których nie mam pojęcia. Na szczęście nigdy nie jest za późno na naukę i nadrabianie zaległości.

Postaram się przedstawić na prostych przykładach każdy z typów. Zazwyczaj korzystam z bibliotek NUnit Rhino Mocks, dlatego też wszystkie poniższe przykłady zostały stworzone w oparciu właśnie o te biblioteki.

  1. Dummy (manekin, atrapa)
    Jest to sztuczny obiekt, który tworzymy zazwyczaj tylko po to, żeby nasz kod się skompilował. Najlepszym przykładem będzie wywołanie metody przyjmującej jakieś parametry, które nie mają żadnego znaczenia z punktu widzenia naszego testu. W takim przypadku przekazujemy parametry tylko po to żeby zaspokoić wymagania interfejsu. Poniżej znajdują się trzy wywołania metody Add, w których nie interesuje nas co zostaje przekazane w parametrze, więc korzystamy z obiektu typu dummy.
  2. Fake (imitacja, podróbka)
    Nowy typ implementujący konkretny interfejs. Tworzony jest zazwyczaj tylko na potrzeby testów. Nie znajduje zastosowania w produkcyjnym kodzie. Często korzysta się z tego typu żeby stworzyć sztuczną bazę danych, która przechowuje wszystkie wpisy w pamięci.
  3. Stub (pieniek, kikut)
    Wydmuszka obiektu, którą możemy odpowiednio konfigurować tak, aby zwracała konkretne wartości w przypadku wywołania poszczególnych funkcji. Jeżeli nie ustalimy zwrotu dla metody, która jest wywoływana w trakcie testu, zostanie zwrócona domyślna wartość.
  4. Mock (imitacja)
    Używamy go w sytuacjach kiedy nie interesuje nas stan obiektu tylko jego zachowanie. Pozwala nam sprawdzić czy konkretna metoda została wywołana i z jakimi parametrami. Przed wywołaniem testowanej funkcji definiujemy nasze oczekiwania co do wywoływanych funkcji i sprawdzamy na koniec testu czy założenia zostały spełnione.

    Warto pamiętać, że jeżeli nie podamy oczekiwanego zachowania dla konkretnej metody mock’a, która zostanie wywołana w trakcie testu, zostanie wyrzucony wyjątek. Inaczej wygląda to w przypadku Stub’a. Tam zawsze zostanie zwrócona domyślna wartość.

Jeden komentarz dotyczący “Dummy, Fake, Stub i Mock w testach jednostkowych

Dodaj komentarz

Twój adres email nie będzie opublikowany. Pola wymagane zostały oznaczone *