目录
  • 简介
  • 导包
  • 使用步骤
    • 1.构造代码
    • 2.使用mockgen生成mock代码
    • 3.建立测试用例
  • go:generate生成mock代码

    简介

    mock翻译过来是‘模拟’的意思,也就是模拟接口返回的信息,用已有的信息替换接口返回的信息,从而提供仿真环境,实现模拟数据下的功能测试;

    在多人合作编码时,你写的一个函数func DoSth(People)用到了别人写的People接口。此时你的函数已经写好了,但是实现People接口的程序员还在磨蹭,而这时你想要测试func DoSth()是否正确运行,就需要gomock接口模拟技术。

    导包

    安装gomock包以及mockgen(mock代码生成器)

     go get -u github.com/golang/mock/gomock
     go install github.com/golang/mock/mockgen

    使用步骤

    1.构造代码

    type People interface {
        GetName() string
        GetAge() int
    }
    func GetPeopleInfo(people People) {
        //调用接口
        println("name:", people.GetName(), "age:", people.GetAge())
    }

    示例构造了一个函数GetPeopleInfo(People),调用了People接口。

    2.使用mockgen生成mock代码

    mockgen主要有两种使用方式:

    1.通过source构建:从源文件生成 mock 接口(通过 -source 启用)

    mockgen -source=foo.go [other options]

    2.通过reflect构建:通过使用反射程序来生成 mock 接口。它通过传递两个非标志参数来启用:导入路径和逗号分隔的接口列表

    mockgen database/sql/driver Conn,Driver

    具体参数可以在命令行输入mockgen进行查看。

    本文中使用2进行mock代码的构建

    代码结构:

    Test
    ├── gomock2
           └── db.go

    使用的mockgen命令:

    mockgen  -destination db_mock.go -package gomock2 Test/gomock2 People

    -destination db_mock.go:表明生成的mock代码存放在db_mock.go
    -package gomock2:生成代码所属包名为gomock2
    Test/gomock2 People :对Test/gomock2下的People接口进行模拟

    成功后会生成db_mock.go文件。

    3.建立测试用例

    func TestGetFromDB(t *testing.T) {
         //创建mock控制器,控制器
        controller := gomock.NewController(t)
        defer controller.Finish()//触发最后的断言
        mockPeople := NewMockPeople(controller)
        mockPeople.EXPECT().GetName().Return("yi")
        mockPeople.EXPECT().GetAge().Return(18).Times(1) //预计返回18并被调用1次
        //调用测试方法 
        GetPeopleInfo(mockPeople)
    }

    主要有下面几个步骤:
    1.创建mock控制器,控制器定义了mock对象的作用域、生命周期、期待值。
    2. defer controller.Finish():触发断言,判断结果是否符合预期。
    3. 创建Mock对象:Mock对象实现了要模拟的接口。
    4. 设计预期值,接口的输入、返回。
    5. 调用测试方法。

    go:generate生成mock代码

    在interface所对应的go文件中加入注释:

    //go:generate mockgen  -destination db_mock.go -package gomock2 Test/gomock2 People

    随后在命令行的当前目录下执行下面语句就能自动生成mock代码

    go generate

    或者在项目根目录输入,执行当前项目中所有go:generate注释表示的内容。

    go generate ./...
    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。