やりたいこと
外部APIやDBへのアクセス処理が含まれるメソッドをモックしてテストできるような作りにします。
以下★のメソッドをテストします。
実装側
外部アクセス処理のあるGetメソッドを外から差し込んで利用します。
// main.go 1つ目のファイル
package main
import (
"fmt"
"net/http"
)
type A struct {
Name string
}
type AIf interface {
Get() string
}
func main() {
a := A{"本物"}
s := Example(&a)
fmt.Println(s)
}
// ★テスト対象メソッド
func Example(a AIf) string {
s := a.Get()
return s
}
func (a *A) Get() string {
_, _ = http.Get("yahoo.co.jp")
return a.Name + "のGetメソッド"
}
main実行結果
本物のGetメソッド
実装側
外部アクセス処理のないテスト用Getメソッドを外から差し込み利用することでExampleメソッドの処理を最後まで通せるようにします。
// main_test.go 2つ目のファイル
package main
import (
"github.com/stretchr/testify/assert"
"testing"
)
type AMock struct {
Name string
}
func Test(t *testing.T) {
t.Run("success test", func(t *testing.T) {
a := AMock{"テスト用"}
s := Example(&a)
assert.Equal(t, "テスト用のGetメソッド", s)
t.Log(s)
})
}
func (a *AMock) Get() string {
return a.Name + "のGetメソッド"
}
Test実行結果
テスト用のGetメソッド
ポイントとなる点
Exampleメソッドにインターフェース型で構造体のアドレスを渡します。