Go Academy · Lezione

Test double: mock e stub

Interfacce per la testabilità e l'iniezione delle dipendenze

Lezione 3 di 413 passaggi

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
Gratis per iniziare

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

  1. Scrivere test unitari con testing
  2. Test basati su tabelle
  3. Test double: mock e stub
  4. Copertura dei test e testify
← Torna a Go Academy