摘要:使用Golang的官方mock工具--gomock - 簡書
摘要2:GoMock架構使用指南 - 簡書
摘要3:用gomock進行mock測試_weixin_34087307的部落格-CSDN部落格
摘要4:gomonkey架構:Golang mock 架構實踐_baijiwei的部落格-CSDN部落格_golang mock
項目結構:
1.期望輸入1,傳回1
stub_test.go
packege trygomock
import (
"github.com/golang/mock/gomock"
"testing"
"unit_test_class/mock"
)
func TestStub(t *testing.T) {
ctl := gomock.NewController(t)
defer ctl.Finish()
client := mock.NewMockMySQLClient(ctl) // mock包中通過interface接口生成的mock函數
// 期望輸入1,傳回1
client.EXPECT().Exec(1).Return(2)
x := Stub(client, 1)
if x != 2 {
t.Fatal()
}
}
stub.go
packege trygomock
import "fmt"
func Stub(client MySQLClient, x int) int {
if client == nil {
return -1
}
res := client.Exec(x)
fmt.Println(""res:", res)
return res
}
myclient.go
packege trygomock
typr MySQLClient interface {
Exec(x int) int
}
myclientimpl.go
package trygomock
type Client struct {
}
func (c *Client) Exec(x int) int {
i := x
return i
}
2.強制輸入指定資料,否者報錯
stub_test.go
packege trygomock
import (
"github.com/golang/mock/gomock"
"testing"
"unit_test_class/mock"
)
func TestStub2(t *testing.T) {
ctl := gomock.NewController(t)
defer ctl.Finish()
client := mock.NewMockMySQLClient(ctl) // mock包中通過interface接口生成的mock函數
// 強制輸入888,否則報錯
client.EXPECT().Exec(gomock.Eq(888)).Return(2) // 強制指定輸入參數為888
x := Stub(client, 888)
if x != 2 {
t.Fatal()
}
}
3.無論輸入參數是什麼,結果都傳回指定值
stub_test.go
packege trygomock
import (
"github.com/golang/mock/gomock"
"testing"
"unit_test_class/mock"
)
func TestStub3(t *testing.T) {
ctl := gomock.NewController(t)
defer ctl.Finish()
client := mock.NewMockMySQLClient(ctl) // mock包中通過interface接口生成的mock函數
// 輸入參數都可以,傳回結果值必須是指定的值
client.EXPECT().Exec(gomock.Any()).Return(999) // 指定必須傳回999
x := Stub(client, 3) // 這裡随便什麼參數都行
if x != 999 {
t.Fatal()
}
}
4.整合測試用例(打樁)
stub_test.go
packege trygomock
import (
"github.com/golang/mock/gomock"
"testing"
"unit_test_class/mock"
)
func TestStub4(t *testing.T) {
testCase := []struct {
Name string
GetParam func() (int, int)
Stub func(ctl *gomock.Controller) MySQLClient
}{
{
Name : "期望輸入1, 傳回1",
Stub : func(ctl *gomock.Controller) *MySQLClient {
client := mock.NewMockMySQLClient(ctl)
client.EXPECT().Exec(1).Return(1)
return client
},
GetParam : func() (int, int){
return 1, 1
}
},
{
Name : "強制輸入888,否則報錯",
Stub : func(ctl *gomock.Controller) *MySQLClient {
client := mock.NewMockMySQLClient(ctl)
client.EXPECT().Exec(gomock.Eq(888)).Return(2)
return client
},
GetParam : func() (int, int){
return 888, 2
}
}
}
for _, ut := range TestCase {
t.Run(ut.Name, func(t *testing.T) {
ctl := gomock.NewController(t)
defer ctl.Finish()
client := ut.Stub(ctl)
x := Stub(client, 3)
if x != 999 {
t.Fatal()
}
})
}
}