見出し画像

golang gomockの使い方と注意点

今回はGo言語のgomockについてを解説していきます。

gomock

Go言語でのユニットテスト中に外部依存関係をモックすることで、テストの質を向上させ、独立してテストを行うことができます。
Goではインターフェースを使ってgomockやtestify/mockのようなライブラリで簡単にmockを作ることができます。


gomockの使い方

gomockのインストール

gomockをプロジェクトに追加するには、以下のコマンドを実行します。

go get github.com/golang/mock/gomock
go install github.com/golang/mock/mockgen


モックを生成するためのインターフェース定義

モックを生成するためには、まずモックしたい依存関係のインターフェースを定義します。
例えば、データを取得するリポジトリのインターフェースがあるとします。

type UserRepository interface {
    GetUser(id int) (*User, error)
}


モックの生成:

mockgenツールを使用してインターフェースのモックを自動生成します。コマンドラインから以下のように実行します。

mockgen -source=path/to/your/interface.go -destination=path/to/your/mock/mock.go -package=mock


モックをテストで使用する

生成されたモックをテストで使用し、特定のメソッドが呼ばれたときの振る舞いを定義します。

func TestGetUser(t *testing.T) {
    ctrl := gomock.NewController(t)
    defer ctrl.Finish()

    mockRepo := mock.NewMockUserRepository(ctrl)
    mockRepo.EXPECT().GetUser(gomock.Any()).Return(&User{}, nil)

    u, err := mockRepo.GetUser(1)
    if err != nil {
        t.Fatal("Expected no error, got", err)
    }
    if u == nil {
        t.Fatal("Expected a user, got nil")
    }
}


gomockの注意点

モックの過剰使用

モックは便利ですが、過剰に使用するとコードの設計問題を隠蔽することがあります。
モックは主に外部システムへの依存を切り離すために使うべきで、クラスやモジュール間の通信には慎重に利用する必要があります。


モックと実際の実装の同期

実際のインターフェースが変更された場合、モックも同様に更新する必要があります。
これを怠ると、テストが実際のコードの振る舞いを正しく反映しなくなることがあります。


golangをもっと詳しくなりたい方に

初めてのGo言語

Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。


詳解Go言語Webアプリケーション開発

こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。

以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。


【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)

まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。
この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。


現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発

個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています


この記事が参加している募集

この経験に学べ

この記事が気に入ったらサポートをしてみませんか?