Mise à jour, juin 2023 : Ce référentiel et ce outil ne sont plus maintenus. Veuillez consulter Go.uber.org/mock pour une fourche maintenue à la place.
Gomock est un cadre moqueur pour le langage de programmation Go. Il s'intègre bien dans le package testing
intégré de Go, mais peut également être utilisé dans d'autres contextes.
Une fois que vous avez installé GO, installez l'outil mockgen
.
Remarque : si vous ne l'avez pas fait, assurez-vous déjà d'ajouter $GOPATH/bin
sur votre PATH
.
Pour obtenir la dernière version publiée, utilisez-vous:
GO111MODULE=on go get github.com/golang/mock/[email protected]
go install github.com/golang/mock/[email protected]
Si vous utilisez mockgen
dans votre pipeline CI, il peut être plus approprié de fixer une version spécifique de Mockgen. Vous devriez essayer de garder la bibliothèque en synchronisation avec la version de Mockgen utilisée pour générer vos simulations.
mockgen
a deux modes de fonctionnement: Source and Reflect.
Le mode source génère des interfaces simulées à partir d'un fichier source. Il est activé en utilisant l'indicateur -Source. Les autres drapeaux qui peuvent être utiles dans ce mode sont -mports et -Arx_Files.
Exemple:
mockgen -source=foo.go [other options]
Le mode Reflect génère des interfaces simulées en créant un programme qui utilise la réflexion pour comprendre les interfaces. Il est activé en faisant passer deux arguments sans drapeau: un chemin d'importation et une liste de symboles séparés par des virgules.
Vous pouvez utiliser "." Pour se référer au package du chemin actuel.
Exemple:
mockgen database/sql/driver Conn,Driver
# Convenient for `go:generate`.
mockgen . Conn,Driver
La commande mockgen
est utilisée pour générer du code source pour une classe simulée étant donné un fichier source GO contenant des interfaces à se moquer. Il prend en charge les drapeaux suivants:
-source
: un fichier contenant des interfaces à moquer.
-destination
: un fichier dans lequel écrire le code source résultant. Si vous ne définissez pas cela, le code est imprimé sur une sortie standard.
-package
: le package à utiliser pour le code source de classe de simulation résultant. Si vous ne définissez pas cela, le nom du package est mock_
avec le package du fichier d'entrée.
-imports
: une liste d'importations explicites qui doivent être utilisées dans le code source résultant, spécifiée comme une liste d'éléments séparés par des virgules du formulaire foo=bar/baz
, où bar/baz
est le package importé et foo
est l'identifiant à utiliser pour le package dans le code source généré.
-aux_files
: une liste de fichiers supplémentaires qui doivent être consultés pour résoudre les interfaces intégrées par EG définies dans un fichier différent. Ceci est spécifié en tant que liste d'éléments séparés par des virgules du formulaire foo=bar/baz.go
, où bar/baz.go
est le fichier source et foo
est le nom du package de ce fichier utilisé par le fichier -source.
-build_flags
: (Mode de réflexion uniquement) Les drapeaux ont réussi à go build
.
-mock_names
: une liste de noms personnalisés pour les simulations générées. Ceci est spécifié en tant que liste d'éléments séparés par des virgules du formulaire de formulaire Repository=MockSensorRepository,Endpoint=MockSensorEndpoint
, où Repository
est le nom d'interface et MockSensorRepository
est le nom de simulation souhaité (la méthode de la faculté de moque et le recier Mock sera nommé d'après la moquette). Si l'une des interfaces n'a pas de nom personnalisé spécifié, la convention de dénomination par défaut sera utilisée.
-self_package
: le chemin d'importation complet d'importation du package pour le code généré. Le but de ce drapeau est d'empêcher les cycles d'importation dans le code généré en essayant d'inclure son propre package. Cela peut se produire si le package de simulation est défini sur l'une de ses entrées (généralement la principale) et que la sortie est STDIO, donc Mockgen ne peut pas détecter le package de sortie final. La définition de ce drapeau indique alors à Mockgen quelle importation à exclure.
-copyright_file
: le fichier de copyright utilisé pour ajouter l'en-tête du copyright au code source résultant.
-debug_parser
: imprimez uniquement les résultats de l'analyseur.
-exec_only
: (Mode de réflexion) Si définissez, exécutez ce programme de réflexion.
-prog_only
: (mode de réflect) génére uniquement le programme de réflexion; Écrivez-le sur stdout et sortez.
-write_package_comment
: Écrit le commentaire de documentation du package (GODOC) Si vrai. (par défaut true)
Pour un exemple de l'utilisation de mockgen
, voir l' sample/
répertoire. Dans des cas simples, vous n'aurez besoin que du drapeau -source
.
type Foo interface {
Bar ( x int ) int
}
func SUT ( f Foo ) {
// ...
}
func TestFoo ( t * testing. T ) {
ctrl := gomock . NewController ( t )
// Assert that Bar() is invoked.
defer ctrl . Finish ()
m := NewMockFoo ( ctrl )
// Asserts that the first and only call to Bar() is passed 99.
// Anything else will fail.
m .
EXPECT ().
Bar ( gomock . Eq ( 99 )).
Return ( 101 )
SUT ( m )
}
Si vous utilisez une version Go de 1.14+, une version Mockgen de 1.5.0+, et passez un * test.t dans gomock.NewController(t)
vous n'avez plus besoin d'appeler explicitement ctrl.Finish()
. Il sera appelé pour vous automatiquement à partir d'une fonction de nettoyage auto-enregistrée.
type Foo interface {
Bar ( x int ) int
}
func SUT ( f Foo ) {
// ...
}
func TestFoo ( t * testing. T ) {
ctrl := gomock . NewController ( t )
defer ctrl . Finish ()
m := NewMockFoo ( ctrl )
// Does not make any assertions. Executes the anonymous functions and returns
// its result when Bar is invoked with 99.
m .
EXPECT ().
Bar ( gomock . Eq ( 99 )).
DoAndReturn ( func ( _ int ) int {
time . Sleep ( 1 * time . Second )
return 101
}).
AnyTimes ()
// Does not make any assertions. Returns 103 when Bar is invoked with 101.
m .
EXPECT ().
Bar ( gomock . Eq ( 101 )).
Return ( 103 ).
AnyTimes ()
SUT ( m )
}
Lorsqu'un Matcher signale un échec, il imprime la valeur reçue ( Got
) par rapport à la valeur attendue ( Want
).
Got: [3]
Want: is equal to 2
Expected call at user_test.go:33 doesn ' t match the argument at index 1.
Got: [0 1 1 2 3]
Want: is equal to 1
Want
La valeur Want
provient de la méthode String()
du Matcher. Si la sortie par défaut du Matcher ne répond pas à vos besoins, il peut être modifié comme suit:
gomock . WantFormatter (
gomock . StringerFunc ( func () string { return "is equal to fifteen" }),
gomock . Eq ( 15 ),
)
Cela modifie la sortie de gomock.Eq(15)
pour Want:
de is equal to 15
à is equal to fifteen
.
Got
La valeur Got
provient de la méthode String()
de l'objet si elle est disponible. Dans certains cas, la sortie d'un objet est difficile à lire (par exemple, []byte
) et il serait utile pour le test de l'imprimer différemment. Le suivant modifie comment la valeur Got
est formatée:
gomock . GotFormatterAdapter (
gomock . GotFormatterFunc ( func ( i interface {}) string {
// Leading 0s
return fmt . Sprintf ( "%02d" , i )
}),
gomock . Eq ( 15 ),
)
Si la valeur reçue est 3
, il sera imprimé comme 03
.
cannot find package "."
... github.com/golang/mock/mockgen/model
Si vous rencontrez cette erreur tout en utilisant le mode de réflexion et les dépendances de vente, il y a trois solutions de contournement parmi lesquelles vous pouvez choisir:
import _ "github.com/golang/mock/mockgen/model"
.--build_flags=--mod=mod
à votre commande mockgen. Cette erreur est due aux modifications du comportement par défaut de la commande go
dans les versions plus récentes. Plus de détails peuvent être trouvés dans # 494.