Как смоделировать реализацию интерфейса - PullRequest
0 голосов
/ 03 апреля 2019

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 (как это требует от нас реализации fun2 и fun3, которые не используются в Foo)?

Есть ли способ, которым мы можем написать тесты для Foo, где нам просто нужно написать фиктивную реализацию fun1, а не для fun2 и fun3?

Кроме того, каков идеальный способ проверить такое использование интерфейсов в Go?

1 Ответ

2 голосов
/ 03 апреля 2019

Вы должны реализовать все методы. Интерфейс - это контракт, и вам необходимо выполнить этот контракт.

Если вы уверены, что методы fun2 и fun3 не будут вызваны, то это обычно означает, что ваш интерфейсный контракт слишком широк. В таком случае рассмотрите возможность извлечения fun1 в выделенный интерфейс.

...