Go言語でMockのテストをしよう! 〜データ作成〜

こんにちは。KOUKIです。

Go言語で、Mockのテスト方法を学んだので、共有します。

テストデータの作成をMockを使って、省略します!

プロジェクトの作成

プロジェクトを作成します。

Mockインストール

本記事では、golang/mock を使用します。

次のパッケージをインストールしてください。

テスト対象のファイルを作成

Mockのテストでは、テスト対象となるインターフェースを定義する必要があります。

上記の「//go:generate mockgen -destination=./mock/storage.go -package=mock github.com/hoge/go-mock Storage」は大切です。

Mockファイルを作成する時の条件になります。

上記に設定したStorageインターフェースに対して、テストコードを書く予定です。

ちなみに、「GetIngredients」は自身が保有するMapデータ(ingredients)のコピーを返します。

本来であれば、ingredientsに格納するテストデータを作成する必要があるのですが、Mockを使ってそれを省略します(それが本記事の目的です)

また、Storageを利用するCook処理についても実装しましょう。

上記のコードでは、CreateMedamaYakiで、目玉焼きを作るメソッドを実装しています。

ここでは、StorageのGetIngredientsを呼び出しています。

Mockファイルの作成

以下のコマンドを実行して、Mockファイルを作成しましょう。

コマンドの実行に成功するとmockフォルダ配下にMockファイル(storage.go)が作成されているはずです。

テストコードの実装

cook_test_goに以下の実装をしてください。

大体の説明は、コメントに書きました。

テストを実行しましょう。

storageMock.EXPECT().GetIngredients().Return(map[string]int{"egg": 5})のように戻り値として設定したい値をMock化できるので、超便利ですね。

インターフェースとして使えないというのは、c := NewCook(storageMock)の部分があるからです。

NewCookはもともとStorage(インターフェース)を引数として持ちますが、GetIngredientsを実装しているオブジェクトならなんでも渡せます。

引数として渡しているstorageMockは、下記のようにGetIngredientsをメソッドとして実装しているので、NewCookが実行できるわけです。(Storageインターフェースに定義しているGetIngredientsを持っているため)

TypeScriptでも勉強しましたが、インターフェースはなかなか便利ですね。

おわりに

ちょっと説明が乱暴でしたが、Mockを使ってデータを簡単に用意できることがお分かり頂けたと思います。

本記事で紹介したMockの機能は、ほんの一部に過ぎません。

色々と試されるといいと思います。

それでは、また!

参考書籍