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
- Pisanie testów jednostkowych za pomocą testing
- Testy oparte na tabelach
- Obiekty zastępcze w testach: mocki i stuby
- Pokrycie testami i testify