mockery 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

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

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

Mockery ist ein leistungsstarkes Tool zur Generierung von Mock-Objekten in Go. In der modernen Go-Entwicklung, wo Interfaces eine zentrale Rolle spielen, erfordert das Testen isolierter Komponenten oft das Erstellen von Platzhaltern für externe Abhängigkeiten. Mockery automatisiert diesen Prozess, indem es vollständige Interface-Implementierungen generiert, die in Unit-Tests verwendet werden können. Anstatt Dutzende Zeilen Code manuell für jedes Interface zu schreiben, führen Sie einfach einen Befehl aus und erhalten einen fertigen Mock mit allen erforderlichen Methoden.

Die Hauptaufgabe von mockery besteht darin, das Testen von Code zu vereinfachen, der von externen Diensten (Datenbanken, APIs, Dateisysteme usw.) abhängt. Die generierten Mocks ermöglichen es Ihnen, Rückgabewerte zu kontrollieren, die Anzahl der Methodenaufrufe zu überprüfen und die Argumente zu validieren, mit denen sie aufgerufen wurden. Dies ist besonders nützlich bei der Entwicklung von Microservices, bei denen jede Komponente isoliert getestet werden muss. Die Bibliothek verwendet das beliebte Paket testify/mock als Grundlage, was die Kompatibilität mit den meisten Go-Projekten gewährleistet.

Mockery unterstützt sowohl einfache Interfaces mit wenigen Methoden als auch komplexe Hierarchien. Es kann Mocks für eingebaute Typen, Interfaces aus Drittanbieter-Paketen und sogar für generische Interfaces (ab Go 1.18) generieren. Dank eines flexiblen Konfigurationssystems können Sie Dateinamen, Pakete für Mocks und sogar eigene Methoden steuern. Das macht mockery zu einem unverzichtbaren Werkzeug im Arsenal jedes Go-Entwicklers, der qualitativ hochwertigen und wartbaren Code anstrebt.

2. Installation

Die Installation von mockery erfolgt über den standardmäßigen Go-Paketmanager. Führen Sie dazu folgenden Befehl aus:

go install github.com/vektra/mockery/v2@latest

Stellen Sie nach der Installation sicher, dass sich die Binärdatei in Ihrem $PATH befindet. Normalerweise wird sie in $GOPATH/bin oder $HOME/go/bin installiert. Sie können die Installation mit folgendem Befehl überprüfen:

mockery --version

Wenn Sie Go-Module verwenden, empfiehlt es sich, mockery als Entwicklungswerkzeug hinzuzufügen. Erstellen oder bearbeiten Sie dazu die Datei tools.go im Projektstammverzeichnis:

//go:build tools
// +build tools

package tools

import (
    _ "github.com/vektra/mockery/v2"
)

Führen Sie dann Folgendes aus:

go mod tidy

Dadurch wird sichergestellt, dass die Version von mockery in Ihrer go.mod-Datei festgehalten wird.

3. Schnellstart – Minimales Arbeitsbeispiel

Betrachten wir ein einfaches Beispiel. Angenommen, wir haben ein Interface UserRepository:

// user.go
package main

type User struct {
    ID   int
    Name string
}

type UserRepository interface {
    GetUser(id int) (*User, error)
    SaveUser(user *User) error
}

Führen Sie zum Generieren des Mocks folgenden Befehl im Projektstammverzeichnis aus:

mockery --name=UserRepository --output=mocks --with-expecter

Dieser Befehl erstellt die Datei mocks/UserRepository.go mit der Mock-Implementierung. Jetzt können wir sie in einem Test verwenden:

// user_test.go
package main

import (
    "testing"
    "github.com/stretchr/testify/assert"
    "your-project/mocks"
)

func TestGetUser(t *testing.T) {
    // Mock erstellen
    mockRepo := mocks.NewUserRepository(t)
    
    // Erwartetes Verhalten konfigurieren
    expectedUser := &User{ID: 1, Name: "Alice"}
    mockRepo.On("GetUser", 1).Return(expectedUser, nil)
    
    // Zu testende Funktion aufrufen
    user, err := mockRepo.GetUser(1)
    
    // Ergebnisse überprüfen
    assert.NoError(t, err)
    assert.Equal(t, expectedUser, user)
    
    // Überprüfen, ob alle Erwartungen erfüllt wurden
    mockRepo.AssertExpectations(t)
}

Empfehlungen