什么是打桩?
打桩这个词可能是从建筑行业借用过来的,指在地面上用锤子或机器将木桩或钢桩打入土中,以作为建筑物的基础。
打桩简单地来说就是把一些代码段进行替代,这些代码段就是“桩”,而GoStub中主要可以做到的就是对一个全局变量进行打桩、对一个函数打桩和对一个过程打桩。
导包
go get github.com/prashantv/gostub
stub与mock的区别
Mock:是模拟的意思,指的是在测试包中创建一个结构体,满足某个外部依赖的接口 interface{}。
Stub: 是桩的意思,指的是在测试包中创建一个模拟方法,用于替换生成代码中的方法。
go stub示例
1.对变量打桩
var num int = 10
func JudgeNum() bool {
return num >= 100
}
func TestStub(t *testing.T) {
convey.Convey("start", t, func() {
stub := gostub.Stub(&num, 150) //对num打桩,将num的值替代为150
defer stub.Reset() //对所有桩上的变量进行重置
convey.So(JudgeNum(), convey.ShouldBeTrue)
stub.Stub(&num, 80)
convey.So(JudgeNum(), convey.ShouldBeTrue) //报错,JudgeNum()返回了false
})
}
2.对函数打桩
var num int = 10
func JudgeNum() bool {
return num >= 100
}
var fc = JudgeNum
func TestStub(t *testing.T) {
convey.Convey("start", t, func() {
stub := gostub.StubFunc(&fc, true)//fc为桩,返回true
defer stub.Reset()
convey.So(fc(), convey.ShouldBeFalse) //报错
})
可以看到convey.So报错,fc()在不打桩的情况下应当返回false,而现在返回值是true。
3.对过程打桩
过程指的就是没有返回值,执行一些工作(比如资源清理)的函数。
//清理函数
func Clear() {
fmt.Println("do clear()")
}
var clear = Clear
func TestStub(t *testing.T) {
convey.Convey("start", t, func() {
stub := gostub.StubFunc(&clear) //对clear函数进行打桩,无返回值
defer stub.Reset()
clear()//调用clear()
})
结果:clear()没有打印输出,说明clear已经被替换成一个没有返回值的过程(桩)。
参考:https://zhuanlan.zhihu.com/p/168539526