Go言語のテストで外部サービスをモックする方法
先生と生徒の会話形式で理解しよう
生徒
「Go言語で外部サービスに依存する処理をテストしたいのですが、安全にテストする方法はありますか?」
先生
「はい、外部サービスを直接呼ぶのではなく、モックを使って擬似的にサービスを再現する方法があります。」
生徒
「モックって何ですか?」
先生
「モックとは、実際のサービスの代わりに使うテスト用の偽物のオブジェクトです。これを使うとネットワークにアクセスせずに安全にテストできます。」
生徒
「具体的にはどのように作るんですか?」
先生
「Go言語では、interfaceを定義して、そのinterfaceを実装したモックを作ります。それでは例を見てみましょう。」
1. interfaceを使ったモックの基本
まず、外部サービスの機能をinterfaceで定義します。interfaceとは、構造体や関数に「この機能は必ず持つ」という契約を示すものです。
type WeatherService interface {
GetTemperature(city string) (int, error)
}
この例では、都市名を受け取って気温を返すサービスを想定しています。
2. モックの作り方
次に、テスト用のモックを作ります。モックはinterfaceを満たす構造体を作り、任意の値を返すように実装します。
type MockWeatherService struct{}
func (m MockWeatherService) GetTemperature(city string) (int, error) {
if city == "Tokyo" {
return 25, nil
}
return 20, nil
}
これで東京の場合は25度、それ以外は20度を返すモックが作れました。
3. モックを使ったテスト例
作成したモックをテストで利用します。テストコードでは、実際の外部サービスの代わりにモックを渡します。
func TestGetTemperature(t *testing.T) {
service := MockWeatherService{}
temp, _ := service.GetTemperature("Tokyo")
if temp != 25 {
t.Errorf("expected 25, got %d", temp)
}
temp, _ = service.GetTemperature("Osaka")
if temp != 20 {
t.Errorf("expected 20, got %d", temp)
}
}
このように、モックを使うことでネットワークにアクセスせずに安全にテストできます。
4. モック活用のポイント
モックを使うとテストが速く、安全に行えます。ポイントは以下の通りです。
- interfaceで機能を定義しておくと、モックと実装の差し替えが簡単です。
- 外部サービスの状態に依存せず、常に同じ結果を返すモックを作るとテストの安定性が向上します。
- 異常系のテストもモックで簡単に再現できます。
5. 初心者向けの実践方法
最初は小さなモックから始め、慣れてきたら複雑なサービスもモック化してみましょう。テストデータや返却値を外部ファイルにまとめると、さらに管理がしやすくなります。