更新、2023年6月:このレポとツールは維持されなくなりました。代わりに維持されているフォークについては、go.uber.org/mockを参照してください。
Gomockは、GOプログラミング言語のモッキングフレームワークです。 Goの組み込みtesting
パッケージとうまく統合されていますが、他のコンテキストでも使用できます。
GOをインストールしたら、 mockgen
ツールをインストールします。
注:まだ行っていない場合は$GOPATH/bin
PATH
に追加してください。
最新のリリースバージョンを使用するには:
GO111MODULE=on go get github.com/golang/mock/[email protected]
go install github.com/golang/mock/[email protected]
CIパイプラインでmockgen
使用する場合、特定のモックゲンバージョンに固定する方が適切かもしれません。モックを生成するために使用されるモックゲンのバージョンとライブラリを同期しておくようにしてください。
mockgen
、ソースと反射の2つの動作モードがあります。
ソースモードソースファイルからモックインターフェイスを生成します。 -Sourceフラグを使用して有効になります。このモードで役立つ可能性のある他のフラグは、-importsと-aux_filesです。
例:
mockgen -source=foo.go [other options]
反射モードは、反射を使用してインターフェイスを理解するプログラムを構築することにより、モックインターフェイスを生成します。インポートパスとシンボルのコンマ分離されたリストという2つの非フラグ引数を渡すことで有効になります。
「。」を使用できます。現在のパスのパッケージを参照してください。
例:
mockgen database/sql/driver Conn,Driver
# Convenient for `go:generate`.
mockgen . Conn,Driver
mockgen
コマンドは、モックするインターフェイスを含むGOソースファイルを考慮して、モッククラスのソースコードを生成するために使用されます。次のフラグをサポートしています。
-source
:モックするインターフェイスを含むファイル。
-destination
:結果のソースコードを書き込むファイル。これを設定しない場合、コードは標準出力に印刷されます。
-package
:結果のモッククラスソースコードに使用するパッケージ。これを設定しない場合、パッケージ名は入力ファイルのパッケージと連結されていmock_
。
-imports
:結果のソースコードで使用する必要がある明示的なインポートのリスト。 foo=bar/baz
の要素のコンマ分離されたリストとして指定されています。ここで、 bar/baz
インポートされているパッケージであり、 foo
は識別子です。生成されたソースコードのパッケージに使用します。
-aux_files
:別のファイルで定義された埋め込まれたインターフェイスを解決するために相談する必要がある追加ファイルのリスト。これは、フォームfoo=bar/baz.go
の要素のコンマ分離されたリストとして指定されています。ここで、 bar/baz.go
はソースファイルであり、 foo
-Sourceファイルで使用されているファイルのパッケージ名です。
-build_flags
:(モードのみを反映して)逐語的に渡されたフラグはgo build
。
-mock_names
:生成されたモックのカスタム名のリスト。これは、フォームRepository=MockSensorRepository,Endpoint=MockSensorEndpoint
のフォームリポジトリの要素のコンマ分離リストとして指定されています。 Repository
はインターフェイス名であり、 MockSensorRepository
は望ましいモック名です(mockファクトリーメソッドとモックレコーダーはモックの後に名前が付けられます)。インターフェイスの1つにカスタム名が指定されていない場合、デフォルトの命名規則が使用されます。
-self_package
:生成されたコードの完全なパッケージインポートパス。このフラグの目的は、独自のパッケージを含めようとすることにより、生成されたコードのインポートサイクルを防ぐことです。これは、モックのパッケージが入力の1つ(通常は主要なもの)に設定され、出力がstdioであるため、Mockgenが最終出力パッケージを検出できない場合に発生する可能性があります。このフラグを設定すると、Mockgenに除外するインポートが表示されます。
-copyright_file
:結果のソースコードに著作権ヘッダーを追加するために使用される著作権ファイル。
-debug_parser
:パーサーの結果のみを印刷します。
-exec_only
:(反射モード)設定する場合、この反射プログラムを実行します。
-prog_only
:(反射モード)反射プログラムのみを生成します。 stdoutとexitに書き込みます。
-write_package_comment
:パッケージドキュメントコメント(godoc)を書き込みます。 (デフォルトは真)
mockgen
の使用例については、 sample/
ディレクトリを参照してください。簡単な場合、 -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 )
}
1.14+のGOバージョンを使用している場合は、1.5.0+のモックゲンバージョンであり、 gomock.NewController(t)
にa *testing.tを渡している場合はctrl.Finish()
明示的に呼び出す必要がなくなります。自己登録クリーンアップ機能から自動的に呼び出されます。
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 )
}
マッチャーが障害を報告すると、受信( Got
)と予想( 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
な変更Want
値は、MatcherのString()
メソッドからのものです。 Matcherのデフォルトの出力がニーズを満たしていない場合、次のように変更できます。
gomock . WantFormatter (
gomock . StringerFunc ( func () string { return "is equal to fifteen" }),
gomock . Eq ( 15 ),
)
これis equal to 15
gomock.Eq(15)
マッチャーの出力がis equal to fifteen
ですWant:
Got
Got
値は、使用可能な場合はオブジェクトのString()
メソッドから生じます。場合によっては、オブジェクトの出力を読み取るのが難しく( []byte
など)、テストが異なる方法で印刷するのに役立ちます。以下は、 Got
値がどのようにフォーマットされるかを変更します。
gomock . GotFormatterAdapter (
gomock . GotFormatterFunc ( func ( i interface {}) string {
// Leading 0s
return fmt . Sprintf ( "%02d" , i )
}),
gomock . Eq ( 15 ),
)
受信した値が3
の場合、 03
として印刷されます。
cannot find package "."
... github.com/golang/mock/mockgen/model
リフレクトモードとベンダーリングの依存関係を使用しているときにこのエラーに遭遇した場合、次の3つの回避策があります。
import _ "github.com/golang/mock/mockgen/model"
。--build_flags=--mod=mod
bockgenコマンドを追加します。このエラーは、より最近のバージョンのgo
コマンドのデフォルト動作の変更によるものです。詳細については、#494をご覧ください。