Update, Juni 2023 : Dieses Repo und dieses Tool werden nicht mehr gewartet. Weitere Informationen finden Sie in Go.uber.org/mock, um stattdessen eine gewartete Gabel zu erhalten.
Gomock ist ein spöttischer Rahmen für die Go -Programmiersprache. Es integriert sich gut in das integrierte testing
von Go, kann aber auch in anderen Kontexten verwendet werden.
Sobald Sie GO installiert haben, installieren Sie das mockgen
-Werkzeug.
Hinweis : Wenn Sie dies noch nicht getan haben, müssen Sie Ihrem PATH
$GOPATH/bin
.
Um die neueste Version zu erhalten: Verwendung:
GO111MODULE=on go get github.com/golang/mock/[email protected]
go install github.com/golang/mock/[email protected]
Wenn Sie mockgen
in Ihrer CI -Pipeline verwenden, ist es möglicherweise angemessener, auf eine bestimmte Mockgen -Version zu fixieren. Sie sollten versuchen, die Bibliothek mit der Version von Mockgen synchronisiert zu halten, mit der Ihre Mocks generiert werden.
mockgen
hat zwei Betriebsmodi: Quelle und reflektiert.
Der Quellmodus generiert Mock -Schnittstellen aus einer Quelldatei. Es wird durch die Verwendung der Flagge -SOURCE aktiviert. Andere Flags, die in diesem Modus nützlich sein können, sind -imports und -aux_files.
Beispiel:
mockgen -source=foo.go [other options]
Der Reflect -Modus erzeugt Mock -Schnittstellen, indem ein Programm erstellt wird, das Reflexion verwendet, um Schnittstellen zu verstehen. Es wird aktiviert, indem zwei Argumente ohne Flagge übergeben werden: einen Importpfad und eine von Kommas getrennte Liste von Symbolen.
Sie können "" verwenden ". sich auf das Paket des aktuellen Pfades beziehen.
Beispiel:
mockgen database/sql/driver Conn,Driver
# Convenient for `go:generate`.
mockgen . Conn,Driver
Der Befehl mockgen
wird verwendet, um Quellcode für eine Mock -Klasse zu generieren, die eine Go -Quelldatei mit Schnittstellen enthält, die verspottet werden sollen. Es unterstützt die folgenden Flaggen:
-source
: Eine Datei, die Schnittstellen enthält, die verspottet werden sollen.
-destination
: Eine Datei, in die der resultierende Quellcode geschrieben werden soll. Wenn Sie dies nicht festlegen, wird der Code in die Standardausgabe gedruckt.
-package
: Das Paket für den resultierenden Quellcode der Scheinklasse. Wenn Sie dies nicht festlegen, wird der Paketname mit dem Paket der Eingabedatei mock_
verkettet.
-imports
: Eine Liste explizite Importe, die im resultierenden Quellcode verwendet werden sollten, der als von Kommas getrennte Liste der Elemente des Formulars foo=bar/baz
angegeben wird, wobei bar/baz
das Paket importiert und foo
der Kenner ist Um das Paket im generierten Quellcode zu verwenden.
-aux_files
: Eine Liste zusätzlicher Dateien, die konsultiert werden sollten, um EG -eingebettete Schnittstellen in einer anderen Datei zu beheben. Dies wird als von Kommas getrennte Liste von Elementen des Formulars foo=bar/baz.go
angegeben, wobei bar/baz.go
die Quelldatei ist und foo
der Paketname dieser Datei ist, die von der -source -Datei verwendet wird.
-build_flags
: (nur den Modus reflektieren) Flags haben wörtlich übergeben, um zu go build
.
-mock_names
: Eine Liste benutzerdefinierter Namen für generierte Mocks. Dies wird als von Comma getrennte Liste von Elementen des Formulars Repository=MockSensorRepository,Endpoint=MockSensorEndpoint
, angegeben, wobei Repository
der Grenzflächenname ist und MockSensorRepository
der gewünschte Scheinname ist (Mock Factory-Methode und Mock Recorder werden nach dem Mock bezeichnet). Wenn eine der Schnittstellen keinen benutzerdefinierten Namen angegeben hat, wird die Standardnamenkonvention verwendet.
-self_package
: Der vollständige Paket -Import -Pfad für den generierten Code. Der Zweck dieser Flagge ist es, Importzyklen im generierten Code zu verhindern, indem versucht wird, ein eigenes Paket aufzunehmen. Dies kann passieren, wenn das Paket des Mocks auf einen seiner Eingänge eingestellt ist (normalerweise das Hauptausgang), und der Ausgang ist STDIO, sodass Mockgen das endgültige Ausgabepaket nicht erkennen kann. Wenn Sie dieses Flag einstellen, wird Mockgen angegeben, den ausgeschlossen werden soll.
-copyright_file
: Copyright -Datei zum Hinzufügen des Copyright -Headers zum resultierenden Quellcode.
-debug_parser
: Nur Parser -Ergebnisse ausdrucken.
-exec_only
: (reflektieren Modus) Führen Sie dieses Reflexionsprogramm aus.
-prog_only
: (reflektieren Modus) generieren nur das Reflexionsprogramm; Schreiben Sie es an stdout und beenden Sie.
-write_package_comment
: schreibt Paketdokumentation Kommentar (GODOC), falls wahr. (Standard true)
Für ein Beispiel für die Verwendung von mockgen
siehe sample/
Verzeichnis. In einfachen Fällen benötigen Sie nur die -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 )
}
Wenn Sie eine GO -Version von 1.14+ verwenden, eine Mockgen -Version von 1.5.0+, und ein *testing.t in gomock.NewController(t)
übergeben, müssen Sie nicht mehr explizit ctrl.Finish()
aufrufen. Es wird Sie automatisch von einer selbst registrierten Bereinigungsfunktion aufgerufen.
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 )
}
Wenn ein Match einen Fehler meldet, druckt er den empfangenen ( Got
) gegen den erwarteten ( Want
) Wert.
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
Der Want
-Wert stammt von der String()
-Methode des Matchers. Wenn die Standardausgabe des Matchers Ihren Anforderungen nicht entspricht, kann er wie folgt geändert werden:
gomock . WantFormatter (
gomock . StringerFunc ( func () string { return "is equal to fifteen" }),
gomock . Eq ( 15 ),
)
Dies modifiziert die Ausgabe des Matchs von gomock.Eq(15)
für Want:
Von is equal to 15
is equal to fifteen
.
Got
Der Got
-Wert stammt aus der String()
-Methode des Objekts, wenn er verfügbar ist. In einigen Fällen ist die Ausgabe eines Objekts schwer zu lesen (z. B. []byte
) und es wäre hilfreich, wenn der Test ihn unterschiedlich ausdruiert. Im Folgenden wird geändert, wie der Wert des Got
formatiert wird:
gomock . GotFormatterAdapter (
gomock . GotFormatterFunc ( func ( i interface {}) string {
// Leading 0s
return fmt . Sprintf ( "%02d" , i )
}),
gomock . Eq ( 15 ),
)
Wenn der empfangene Wert 3
ist, wird er als 03
gedruckt.
cannot find package "."
... github.com/golang/mock/mockgen/model
Wenn Sie auf diesen Fehler stoßen, während Sie den Reflect -Modus verwenden und Abhängigkeiten verwenden, können Sie drei Problemumgehungen entscheiden, aus denen Sie auswählen können:
import _ "github.com/golang/mock/mockgen/model"
.--build_flags=--mod=mod
zu Ihrem Mockgen-Befehl. Dieser Fehler ist auf Änderungen des Standardverhaltens des go
-Befehls in neueren Versionen zurückzuführen. Weitere Details finden Sie in #494.