单元测试重点是对代码逻辑进行测试,也就是证明:为什么你的代码是正确的。Mock测试是单元测试中常用的一种手段,特别是对于代码运行时对环境有严重依赖的,可以在不具备相应环境的情况下运行。例如:数据库、中间件、或者第三方接口等情况。
利用接口可以很容易的构造Mock环境,方便对代码进行单元测试。
原有实现
在这个实现中,我们定义了一个Obj的结构体,并且定义了getData方法。这里我们假定getData是从第三方服务中获取数据并进行处理。另外我们有一个showTotal的函数用于调用结构体的方法,并且显示出来,相当于后续的程序处理。
如果我们对showTotal进行单元测试的时候,我们会发现需要构建getData的依赖环境才能进行单元测试,所以此时我们可以使用interface构建一个MockObj来伪造getData返回数据,进行不同的场景测试。
package original
import "fmt"
type Obj struct {
name string
}
// This is a real function to connect third party service, like database
func (o Obj) getData() int {
fmt.Printf("This is [%s] environment\n", o.name)
// if we fetch data here
data := map[string]int{
"total": 10,
}
return data["total"]
}
func showTotal(o Obj) int {
total := o.getData()
fmt.