天天看點

Go單元測試(gomock)

摘要:​​​​​​使用Golang的官方mock工具--gomock - 簡書

摘要2:GoMock架構使用指南 - 簡書

摘要3:用gomock進行mock測試_weixin_34087307的部落格-CSDN部落格

摘要4:gomonkey架構:Golang mock 架構實踐_baijiwei的部落格-CSDN部落格_golang mock

項目結構:

Go單元測試(gomock)

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()
            }
        })
    }
}
           

繼續閱讀