Test doubles: mocks en stubs
Interfaces voor testbaarheid en dependency-injectie
Test doubles: mocks en stubs is een gratis Go Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Go Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Go Academy bevat in totaal 4 lessen.
Overzicht van testdubbels
Een testdubbel vervangt een echte afhankelijkheid in tests. Typen: stub (geeft vooraf vastgelegde antwoorden terug), mock (controleert interacties), spy (registreert aanroepen), fake (werkende implementatie in het geheugen).
Interfaces maken testdubbels mogelijk
Ontwerp functies zodat ze interfaces accepteren in plaats van concrete typen. Geef in productie de echte implementatie door en in tests een testdubbel.
type UserStore interface {
FindByID(id int) (*User, error)
}
func GetUser(store UserStore, id int) (*User, error) {
return store.FindByID(id)
}Handmatige stub
Een stub is een eenvoudige struct die een interface implementeert en vooraf geconfigureerde waarden teruggeeft:
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)Handmatige mock
Een mock registreert aanroepen en controleert deze:
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
Het pakket testify/mock genereert of schrijft mockobjecten met verwachtingen voor aanroepen en configuratie van retourwaarden:
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 (voorheen golang/mock) genereert mocks uit interfaces. Gebruik de mockgen-CLI om ze te genereren en gebruik EXPECT() om verwachtingen in te stellen.
Fake
Een fake is een werkende implementatie in het geheugen. Bijvoorbeeld een gebruikersopslag in het geheugen die gebruikers in een map opslaat. Fakes zijn zwaarder om te schrijven, maar realistischer en minder kwetsbaar dan mocks.
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 voor HTTP-clients
net/http/httptest biedt een HTTP-testserver en recorder binnen hetzelfde proces — de standaard fake voor HTTP-afhankelijkheden.
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(User{Name: "Alice"})
}))
defer ts.Close()Wanneer je elk testdubbel gebruikt
Stub: eenvoudig vast antwoord. Mock: aantal en argumenten van aanroepen controleren. Fake: complex gedrag. Vermijd te veel mocks — fakes en echte componenten in integratietests zijn betrouwbaarder.
Kwetsbare tests vermijden
Mocks die een exacte volgorde van aanroepen of exacte waarden van argumenten controleren, worden kwetsbaar naarmate de implementatie verandert. Geef waar mogelijk de voorkeur aan stubs met controles van de uitvoer of aan fakes.
Interfaces ontdekken
Extraheer interfaces nadat je hebt vastgesteld welk oppervlak van het concrete type door aanroepers wordt gebruikt (ISP). Go ondersteunt impliciete implementatie van interfaces — het concrete type hoeft niet te worden aangepast.
Snelle controle
Wat is het belangrijkste verschil tussen een stub en een mock?
Samenvatting: testdubbels
Belangrijkste punten:
- Ontwerp op basis van interfaces om testdubbels mogelijk te maken
- Stub: geeft vooraf vastgelegde gegevens terug; mock: controleert interacties
- httptest voor HTTP; fakes in het geheugen voor opslag
- Vermijd te veel mocks — geef voor complex gedrag de voorkeur aan fakes
Leer Go met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 51
- Lessen
- 203
Veelgestelde vragen
Is de les “Test doubles: mocks en stubs” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Go Academy, waaronder “Test doubles: mocks en stubs”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Go Academy bevat in totaal 4 lessen.
Wat leer ik in “Test doubles: mocks en stubs”?
Interfaces voor testbaarheid en dependency-injectie Je oefent met Go Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Go Academy te beginnen?
Ervaring vooraf is niet nodig. Go Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Test doubles: mocks en stubs”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Go Academy?
Ja. Elke les over Go Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Unittests schrijven met testing
- Table-driven tests
- Test doubles: mocks en stubs
- Testdekking en testify