Test double: mock e stub
Interfacce per la testabilità e l'iniezione delle dipendenze
Test double: mock e stub è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.
Panoramica dei test double
Un test double sostituisce una dipendenza reale nei test. Tipi: stub (restituisce risposte predefinite), mock (verifica le interazioni), spy (registra le chiamate), fake (implementazione funzionante in memoria).
Le interfacce abilitano i test double
Progetti le funzioni in modo che accettino interfacce anziché tipi concreti. In produzione passi l'implementazione reale; nei test passi un test double.
type UserStore interface {
FindByID(id int) (*User, error)
}
func GetUser(store UserStore, id int) (*User, error) {
return store.FindByID(id)
}Stub manuale
Uno stub è una struct semplice che implementa un'interfaccia e restituisce valori preconfigurati:
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)Mock manuale
Un mock registra le chiamate e le verifica:
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
Il package testify/mock genera o definisce oggetti mock con aspettative sulle chiamate e configurazione dei valori restituiti:
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 (in precedenza golang/mock) genera mock a partire dalle interfacce. Utilizzi la CLI mockgen per generarli e EXPECT() per impostare le aspettative.
Fake
Un fake è un'implementazione funzionante in memoria. Ad esempio, un archivio di utenti in memoria che memorizza gli utenti in una mappa. I fake richiedono più lavoro di scrittura, ma sono più realistici e meno fragili dei 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 per client HTTP
net/http/httptest fornisce un server HTTP di test in-process e un recorder: il fake standard per le dipendenze basate su HTTP.
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(User{Name: "Alice"})
}))
defer ts.Close()Quando utilizzare ciascun test double
Stub: risposta fissa e semplice. Mock: verifica del numero e degli argomenti delle chiamate. Fake: comportamenti complessi. Eviti l'uso eccessivo dei mock: i fake e i componenti reali nei test di integrazione sono più affidabili.
Evitare test fragili
I mock che verificano l'ordine esatto delle chiamate o i valori precisi degli argomenti diventano fragili quando l'implementazione evolve. Quando possibile, preferisca stub con asserzioni sull'output o fake.
Individuazione delle interfacce
Estragga le interfacce dopo aver identificato l'insieme di funzionalità del tipo concreto utilizzato dai chiamanti (ISP). Go supporta la soddisfazione implicita delle interfacce: non è necessaria alcuna modifica al tipo concreto.
Verifica rapida
Qual è la differenza principale tra uno stub e un mock?
Riepilogo: test double
Punti chiave:
- Progettare in base alle interfacce per abilitare i test double
- Stub: restituisce dati predefiniti; Mock: verifica le interazioni
- httptest per HTTP; fake in memoria per l'archiviazione
- Eviti l'uso eccessivo dei mock: preferisca i fake per i comportamenti complessi
Impara Go con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 51
- Lezioni
- 203
Domande Frequenti
La lezione «Test double: mock e stub» è gratuita?
Sì — il testo completo di «Test double: mock e stub» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.
Cosa imparerò in «Test double: mock e stub»?
Interfacce per la testabilità e l'iniezione delle dipendenze Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Go Academy?
Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Test double: mock e stub»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Go Academy?
Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Scrivere test unitari con testing
- Test basati su tabelle
- Test double: mock e stub
- Copertura dei test e testify