如何使用具有差异实现的函数接口

我正在使用interface它,我想在测试中模拟其中的一种方法 function1,但我无法弄清楚如何最好地做到这一点,对于产品代码,它将提供 1 个值,对于测试,提供一些模拟值,有人可以吗举个例子?(编辑)这是代码:

https://play.golang.org/p/w367IOjADFV

package main


import (

    "fmt"

    "time"

)


type vInterface interface {

    function1() bool

}


type mStruct struct {

    info string

    time time.Time

}


func (s *mStruct) function1() bool {

    return true

}


func callSomething(si vInterface) bool {

    return si.function1()

}


func (s *mStruct) vl1() bool {

    s.time = time.Now()

    s.info = "vl1->info"

    return callSomething(s)

}


var currentVt1 mStruct


func main() {

    vl1 := currentVt1.vl1()


    fmt.Println(vl1)

}

测试是这样的


func Test_callSomething(t *testing.T) {

    type args struct {

        si vInterface

    }

    tests := []struct {

        name string

        args args

        want bool

    }{

        {

            name: "my tests",

            args: args{


            },

            want: false,

        },

    }

    for _, tt := range tests {

        t.Run(tt.name, func(t *testing.T) {

            if got := callSomething(tt.args.si); got != tt.want {

                t.Errorf("callSomething() = %v, want %v", got, tt.want)

            }

        })

    }

}

但不确定如何正确地嘲笑它......


千巷猫影
浏览 89回答 1
1回答

qq_笑_17

首先,您需要一个实现该vInterface接口的类型(任何类型)。这是一个简单的例子:type mockedVInterface struct {    value bool}func (m mockedVInterface) function1() bool {    return m.value}这是一个我们可以控制的足够简单的实现:我们可以function1()通过简单地将那个值设置到它的字段来告诉它的函数应该返回什么value。此mockedVInterface类型仅为测试目的而创建,生产代码不需要它。把它放在你有测试代码的同一个文件中(放在前面Test_callSomething())。这是测试代码:func Test_callSomething(t *testing.T) {    type args struct {        si vInterface    }    tests := []struct {        name string        args args        want bool    }{        {            name: "testing false",            args: args{                si: mockedVInterface{value: false},            },            want: false,        },        {            name: "testing true",            args: args{                si: mockedVInterface{value: true},            },            want: true,        },    }    for _, tt := range tests {        t.Run(tt.name, func(t *testing.T) {            if got := callSomething(tt.args.si); got != tt.want {                t.Errorf("callSomething() = %v, want %v", got, tt.want)            }        })    }}请注意,在这个简单的例子中,我们还可以使用一个简单的非结构类型,bool它的底层类型如下:type mockedVInterface boolfunc (m mockedVInterface) function1() bool {    return bool(m)}它有效并且测试代码也更简单:tests := []struct {        name string        args args        want bool    }{        {            name: "testing false",            args: args{                si: mockedVInterface(false),            },            want: false,        },        {            name: "testing true",            args: args{                si: mockedVInterface(true),            },            want: true,        },    }但这仅在可模拟接口具有具有单个返回值的单个函数时才有效。在一般情况下,需要一个结构。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go