如何模拟接口实现

时间:2019-04-03 08:39:33

标签: go testing mocking

myinterface.go

type MyInterface interface {
    fun1() string
    fun2() int
    fun3() bool
}


func Foo(mi MyInterface) string {
    return mi.fun1()
}

myinterface_test.go

type MyInterfaceImplementation struct{}

func (mi MyInterfaceImplementation) fun1() string {
    return "foobar"
}

func (mi MyInterfaceImplementation) fun2() int {
    return int(100)
}

func (mi MyInterfaceImplementation) fun3() bool {
    return false
}


func TestFoo(t *testing.T) {
    mi := MyInterfaceImplementation{}
    val := Foo(mi)
    if val != "foobar" {
        t.Errorf("Expected 'foobar', Got %s", mi.fun1())
    }
}

在为Foo编写测试时,有必要对接口MyInterface进行模拟实现(因为它要求我们同时实现fun2fun3 Foo中没有使用)?

有什么方法可以为Foo编写测试,而我们只需要编写fun1的模拟实现而不是fun2fun3的模拟实现?< / p>

此外,在Go中测试接口使用情况的理想方法是什么?

1 个答案:

答案 0 :(得分:2)

您必须实现所有方法。接口是合同,您需要履行此合同。

如果您确定不会调用fun2fun3方法,则通常意味着您的接口协定太宽。在这种情况下,请考虑将fun1提取到专用接口中。