mock - GoMockは、Goプログラミング言語のモックフレームワークです。

(GoMock is a mocking framework for the Go programming language.)

Created at: 2015-06-13 01:15:11
Language: Go
License: Apache-2.0

ゴモック

ビルドステータス 参照に移動

gomockは、Goプログラミング言語のモックフレームワークです。Goの組み込み

testing
パッケージとうまく統合できますが、他のコンテキストでも使用できます。

インストール

Goをインストールしたら、

mockgen
ツールをインストールします。

:まだ行っていない場合は、必ずに追加

$GOPATH/bin
してください
PATH

最新のリリースバージョンを入手するには、次を使用します。

バージョン<1.16に移動

GO111MODULE=on go get github.com/golang/mock/mockgen@v1.6.0

1.16+に移動

go install github.com/golang/mock/mockgen@v1.6.0

CIパイプラインで使用する場合は

mockgen
、特定のmockgenバージョンに固執する方が適切な場合があります。モックの生成に使用されるmockgenのバージョンとライブラリの同期を維持するようにしてください。

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
    は目的のモック名です(モックファクトリメソッドとモックレコーダーはモックにちなんで名付けられます)。インターフェイスの1つにカスタム名が指定されていない場合は、デフォルトの命名規則が使用されます。

  • -self_package
    :生成されたコードの完全なパッケージインポートパス。このフラグの目的は、独自のパッケージをインクルードしようとすることで、生成されたコードのインポートサイクルを防ぐことです。これは、モックのパッケージがその入力の1つ(通常はメインのもの)に設定されており、出力がstdioであるため、mockgenが最終的な出力パッケージを検出できない場合に発生する可能性があります。このフラグを設定すると、どのインポートを除外するかがmockgenに通知されます。

  • -copyright_file
    :結果のソースコードに著作権ヘッダーを追加するために使用される著作権ファイル。

  • -debug_parser
    :パーサーの結果のみを出力します。

  • -exec_only
    :(リフレクトモード)設定されている場合は、このリフレクションプログラムを実行します。

  • -prog_only
    :(リフレクトモード)リフレクションプログラムのみを生成します。stdoutに書き込んで終了します。

  • -write_package_comment
    :trueの場合、パッケージドキュメントコメント(godoc)を書き込みます。(デフォルトはtrue)

の使用例については、ディレクトリ

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)
}

Goバージョンの1.14+、mockgenバージョンの1.5.0+を使用していて、* tests.Tに合格している場合は、明示的

gomock.NewController(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
値はマッチャーの
String()
メソッドから取得されます。マッチャーのデフォルト出力がニーズを満たさない場合は、次のように変更できます。

gomock.WantFormatter(
  gomock.StringerFunc(func() string { return "is equal to fifteen" }),
  gomock.Eq(15),
)

これにより、 fromからへの

gomock.Eq(15)
マッチャーの出力が変更されます。
Want:
is equal to 15
is equal to fifteen

変更
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つの回避策があります。

  1. ソースモードを使用します。
  2. 空のインポートを含めます
    import _ "github.com/golang/mock/mockgen/model"
  3. --build_flags=--mod=mod
    mockgenコマンドに追加します。

go
このエラーは、コマンドのデフォルトの動作が変更されたために発生します。 最近のバージョン。詳細については、をご覧ください。 #494