gomock pour Go : guide complet pour le mocking d'interfaces
1. Qu'est-ce que c'est et pourquoi l'utiliser ?
Dans le développement moderne en Go, les tests jouent un rôle crucial. Cependant, le code dépend souvent de systèmes externes : bases de données, clients HTTP, systèmes de fichiers ou autres microservices. Tester ce code en isolation est complexe, car ces dépendances nécessitent un environnement réel. C'est là qu'intervient gomock — une bibliothèque puissante pour générer et utiliser des mocks (simulateurs) pour les interfaces Go.
gomock permet de créer automatiquement des implémentations d'interfaces qui se comportent de manière prévisible : elles retournent des valeurs définies, vérifient l'ordre des appels, comptent le nombre d'invocations et simulent même des erreurs. Cela rend les tests unitaires rapides, déterministes et indépendants des ressources externes. La bibliothèque s'intègre parfaitement avec le package testing natif et constitue la référence de facto pour le mocking dans la communauté Go.
La valeur principale de gomock réside dans le fait que vous testez le comportement de votre code, et non son implémentation. Vous vérifiez que votre service appelle correctement les méthodes des dépendances avec les bons arguments et traite correctement les résultats. C'est particulièrement important lorsque vous suivez les principes SOLID et le modèle d'Injection de Dépendances (Dependency Injection).
2. Installation
Pour travailler avec gomock, vous devez installer deux composants :
- La bibliothèque gomock — contient le runtime pour travailler avec les mocks.
- L'utilitaire mockgen — un générateur de code de mocks à partir d'interfaces.
L'installation se fait via le gestionnaire de packages Go standard :
# Installation de la bibliothèque
go get github.com/golang/mock/gomock
# Installation de l'utilitaire mockgen
go install github.com/golang/mock/mockgen@v1.6.0
Après l'installation, assurez-vous que mockgen est accessible dans votre PATH. Vous pouvez le vérifier avec la commande :
mockgen --version
Si vous utilisez Go 1.16+, il est recommandé d'ajouter mockgen dans un fichier tools.go pour le versionnage :
// tools.go
// +build tools
package tools
import (
_ "github.com/golang/mock/mockgen"
)
3. Démarrage rapide — un exemple minimal fonctionnel
Prenons un exemple simple. Supposons que nous ayons une interface Greeter que nous souhaitons simuler.
// greeter.go
package main
// Greeter — l'interface que nous allons simuler
type Greeter interface {
Greet(name string) string
}
// Service utilise 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)
}
Générons d'abord le mock :
mockgen -source=greeter.go -destination=mock_greeter.go -package=main
Écrivons maintenant le test :
// greeter_test.go
package main
import (
"testing"
"github.com/golang/mock/gomock"
)
func TestSayHello(t *testing.T) {
// Création du contrôleur gomock
ctrl := gomock.NewController(t)
defer ctrl.Finish()
// Création du mock Greeter
mockGreeter := NewMockGreeter(ctrl)
// Configuration de l'attente : lors de l'appel à Greet("Alice"), retourner "Bonjour, Alice !"
mockGreeter.EXPECT().Greet("Alice").Return("Bonjour, Alice !")
// Création du service avec le mock
service := NewService(mockGreeter)
// Appel de la méthode testée
result := service.SayHello("Alice")
// Vérification du résultat
if result != "Bonjour, Alice !" {
t.Errorf("Attendu 'Bonjour, Alice !', obtenu '%s'", result)
}
}
Lancez le test :
go test -v
Vous verrez que le test réussit. Le mock a automatiquement vérifié que la méthode Greet a été appelée avec le bon argument et a retourné la valeur attendue.
Aussi dans la bibliothèque
Travailler avec CSV en JavaScript (Node.js) : bibliothèques, parsing et génération de données
Travailler avec Markdown en C++ : bibliothèques md4c, cmark et cpp-markdown
Travailler avec Markdown en Go (Golang) : bibliothèques, analyse et conversion
gomail