0Pricing
Go Academy · Lekcja

Obiekty zastępcze w testach: mocki i stuby

Interfejsy na potrzeby testowalności i wstrzykiwania zależności

Obiekty zastępcze w testach: mocki i stuby to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Przegląd dublerów testowych

Dubler testowy zastępuje rzeczywistą zależność podczas testów. Typy: stub (zwraca z góry ustalone odpowiedzi), mock (weryfikuje interakcje), spy (rejestruje wywołania), fake (działająca implementacja w pamięci).

Interfejsy umożliwiają stosowanie dublerów testowych

Projektuj funkcje tak, aby przyjmowały interfejsy zamiast konkretnych typów. W środowisku produkcyjnym przekazuj rzeczywistą implementację, a w testach — dublera testowego.

type UserStore interface {
    FindByID(id int) (*User, error)
}

func GetUser(store UserStore, id int) (*User, error) {
    return store.FindByID(id)
}

Ręczny stub

Stub to prosta struktura implementująca interfejs i zwracająca wstępnie skonfigurowane wartości:

type stubStore struct{ user *User; err error }
func (s *stubStore) FindByID(_ int) (*User, error) { return s.user, s.err }

// In test:
store := &stubStore{user: &User{Name: "Alice"}}
result, _ := GetUser(store, 1)

Ręczny mock

Mock rejestruje wywołania i sprawdza ich poprawność:

type mockStore struct {
    called bool
    gotID  int
    user   *User
}
func (m *mockStore) FindByID(id int) (*User, error) {
    m.called = true; m.gotID = id
    return m.user, nil
}
// Assert: if !mock.called { t.Error(...) }

testify/mock

Pakiet testify/mock generuje obiekty mock lub umożliwia ich zapisanie, wraz z oczekiwaniami dotyczącymi wywołań i konfiguracją zwracanych wartości:

type MockStore struct { mock.Mock }
func (m *MockStore) FindByID(id int) (*User, error) {
    args := m.Called(id)
    return args.Get(0).(*User), args.Error(1)
}
// In test:
m := new(MockStore)
m.On("FindByID", 1).Return(&User{}, nil)
m.AssertExpectations(t)

gomock

go.uber.org/mock/gomock (wcześniej golang/mock) generuje mocki na podstawie interfejsów. Użyj interfejsu wiersza poleceń mockgen do ich wygenerowania, a następnie użyj EXPECT(), aby ustawić oczekiwania.

Fake

Fake to działająca implementacja przechowująca dane w pamięci. Przykładem może być przechowujący użytkowników w mapie magazyn użytkowników działający w pamięci. Fake wymaga więcej pracy przy implementacji, ale jest bardziej realistyczny i mniej podatny na awarie niż mock.

type fakeStore struct{ users map[int]*User }
func (f *fakeStore) FindByID(id int) (*User, error) {
    u, ok := f.users[id]
    if !ok { return nil, ErrNotFound }
    return u, nil
}

httptest dla klientów HTTP

net/http/httptest udostępnia procesowy serwer HTTP i rejestrator do testów — jest standardowym fake'em dla zależności opartych na HTTP.

ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    json.NewEncoder(w).Encode(User{Name: "Alice"})
}))
defer ts.Close()

Kiedy używać poszczególnych dublerów

Stub: prosta, stała odpowiedź. Mock: weryfikowanie liczby wywołań i argumentów. Fake: złożone zachowanie. Unikaj nadmiernego stosowania mocków — fake'i i rzeczywiste komponenty w testach integracyjnych są bardziej niezawodne.

Unikanie kruchych testów

Mocki sprawdzające dokładną kolejność wywołań lub konkretne wartości argumentów stają się kruche wraz z rozwojem implementacji. W miarę możliwości preferuj stuby ze sprawdzaniem wyników albo fake'i.

Rozpoznawanie interfejsu

Wyodrębniaj interfejsy po zidentyfikowaniu zakresu konkretnego typu używanego przez wywołujących (ISP). Go obsługuje niejawne spełnianie interfejsów — modyfikowanie konkretnego typu nie jest potrzebne.

Szybkie sprawdzenie

Jaka jest główna różnica między stubem a mockiem?

Podsumowanie: dublerzy testowi

Najważniejsze informacje:

  • Projektuj w oparciu o interfejsy, aby umożliwić stosowanie dublerów testowych
  • Stub: zwraca z góry ustalone dane; mock: weryfikuje interakcje
  • httptest służy do testowania HTTP; fake'i w pamięci — do testowania magazynów danych
  • Unikaj nadmiernego stosowania mocków — w przypadku złożonych zachowań preferuj fake'i

Często zadawane pytania

Czy lekcja „Obiekty zastępcze w testach: mocki i stuby” jest bezpłatna?

Tak — pełny tekst „Obiekty zastępcze w testach: mocki i stuby” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Obiekty zastępcze w testach: mocki i stuby”?

Interfejsy na potrzeby testowalności i wstrzykiwania zależności Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Go Academy?

Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Obiekty zastępcze w testach: mocki i stuby”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?

Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Pisanie testów jednostkowych za pomocą testing
  2. Testy oparte na tabelach
  3. Obiekty zastępcze w testach: mocki i stuby
  4. Pokrycie testami i testify
← Powrót do Go Academy