gomock für Go: Vollständige Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

gomock für Go: Vollständige Anleitung zum Mocking von Interfaces

1. Was ist gomock und warum wird es benötigt?

In der modernen Go-Entwicklung spielt das Testen eine zentrale Rolle. Allerdings ist Code oft von externen Systemen abhängig: Datenbanken, HTTP-Clients, Dateisysteme oder andere Microservices. Solchen Code isoliert zu testen ist schwierig, da diese Abhängigkeiten eine reale Umgebung erfordern. Hier kommt gomock ins Spiel – eine leistungsstarke Bibliothek zur Generierung und Verwendung von Mocks (Test-Stubs) für Go-Interfaces.

gomock ermöglicht es, automatisch Implementierungen von Interfaces zu erstellen, die sich vorhersagbar verhalten: Sie geben definierte Werte zurück, prüfen die Reihenfolge von Aufrufen, zählen die Anzahl der Zugriffe und simulieren sogar Fehler. Das macht Unit-Tests schnell, deterministisch und unabhängig von externen Ressourcen. Die Bibliothek ist eng mit dem integrierten testing-Paket verzahnt und gilt als De-facto-Standard für Mocking in der Go-Community.

Der Hauptwert von gomock liegt darin, dass Sie das Verhalten Ihres Codes testen, nicht seine Implementierung. Sie prüfen, ob Ihr Service die Methoden der Abhängigkeiten mit den richtigen Argumenten aufruft und die Ergebnisse korrekt verarbeitet. Das ist besonders wichtig, wenn Sie nach den SOLID-Prinzipien und dem Dependency-Injection-Muster arbeiten.

2. Installation

Für die Arbeit mit gomock müssen Sie zwei Komponenten installieren:

  1. Die gomock-Bibliothek – enthält die Laufzeitumgebung für die Arbeit mit Mocks.
  2. Das Tool mockgen – ein Code-Generator für Mocks aus Interfaces.

Die Installation erfolgt über den standardmäßigen Go-Paketmanager:

# Bibliothek installieren
go get github.com/golang/mock/gomock

# Tool mockgen installieren
go install github.com/golang/mock/mockgen@v1.6.0

Überprüfen Sie nach der Installation, ob mockgen in Ihrem PATH verfügbar ist:

mockgen --version

Wenn Sie Go 1.16+ verwenden, empfiehlt es sich, mockgen zur Versionskontrolle in eine tools.go-Datei aufzunehmen:

// tools.go
// +build tools

package tools

import (
    _ "github.com/golang/mock/mockgen"
)

3. Schnellstart – Minimales funktionsfähiges Beispiel

Betrachten wir ein einfaches Beispiel. Angenommen, wir haben ein Interface Greeter, das wir mocken möchten.

// greeter.go
package main

// Greeter – das Interface, das wir mocken werden
type Greeter interface {
    Greet(name string) string
}

// Service verwendet Greeter
type Service struct {
    greeter Greeter
}

func NewService(g Greeter) *Service {
    return &Service{greeter: g}
}

func (s *Service) SayHello(name string) string {
    return s.greeter.Greet(name)
}

Zuerst generieren wir den Mock:

mockgen -source=greeter.go -destination=mock_greeter.go -package=main

Jetzt schreiben wir den Test:

// greeter_test.go
package main

import (
    "testing"
    "github.com/golang/mock/gomock"
)

func TestSayHello(t *testing.T) {
    // gomock-Controller erstellen
    ctrl := gomock.NewController(t)
    defer ctrl.Finish()

    // Greeter-Mock erstellen
    mockGreeter := NewMockGreeter(ctrl)

    // Erwartung konfigurieren: Bei Aufruf von Greet("Alice") "Hallo, Alice!" zurückgeben
    mockGreeter.EXPECT().Greet("Alice").Return("Hallo, Alice!")

    // Service mit dem Mock erstellen
    service := NewService(mockGreeter)

    // Die zu testende Methode aufrufen
    result := service.SayHello("Alice")

    // Ergebnis prüfen
    if result != "Hallo, Alice!" {
        t.Errorf("Erwartet 'Hallo, Alice!', erhalten '%s'", result)
    }
}

Führen Sie den Test aus:

go test -v

Sie werden sehen, dass der Test erfolgreich durchläuft. Der Mock hat automatisch überprüft,

Empfehlungen