监视Golang中的方法

时间:2018-09-21 15:10:28

标签: unit-testing go mocking spy

有什么办法可以监视Golang中的方法吗?

例如,假设我有

type Object struct { 
    A int
    B string
    C *interface{}
}   

func (o *Object) Something(val interface{}) {
    o.A = 102
    // some other business logic under test

    o.SomethingElse(o.C, val)
}

//...

func (o *Object) Process(val interface{}) interface{} { 
    // some business logic

    return 43 // or something else. no me importa ya
}

//...

func (o *Object) SomethingElse(iPtr *interface{}, val interface{}) { 

    processedVal := o.Process(val)
    if iPtr == nil { 
        iPtr = new(interface{})
    }

    *iPtr = val
}

在编写针对Object.Something的测试时,我们不必关心SomethingElse或从内部调用的Process中发生的情况。在Golang中,有什么方法可以隔离这些依赖关系?

3 个答案:

答案 0 :(得分:2)

我对间谍的理解是,对象的单一方法是伪造的,而其他方法则不是。在Go中是不可能的。但是您可以使用接口来伪造或嘲笑整个依赖项。

要伪造SomethingElse方法,您必须将其放在与Object结构不同的另一个结构上。 Object结构还需要一个与SomethingElse方法的接口。

type Object struct {
    A     int
    elser Elser
}

func (o *Object) Something() {
    // o.A = 102
    o.elser.SomethingElse()
}

type Elser interface {
    SomethingElse()
}

现在,您可以通过创建实现Object方法的伪造品来测试SomethingElse的行为:

type fakeElser struct {
    somethingElseWasCalled bool
}

func (f *fakeElser) SomethingElse() {
    f.somethingElseWasCalled = true
}

func TestSomething(t *testing.T) {
    fake := &fakeElser{}
    o := &Object{
        elser: fake,
    }
    o.Something()

    if o.A != 102 {
        t.Errorf("expected A to be %d", 102)
    }

    if !fake.somethingElseWasCalled {
        t.Error("expected SomethingElse to be called")
    }
}

https://developer.android.com/reference/android/widget/FrameLayout

答案 1 :(得分:-1)

  

有什么办法可以监视Golang中的方法吗?

否。

答案 2 :(得分:-3)

在使用go时,如果您将小写第一个字母,则可以将函数设为私有(它们只能从同一包中调用)。

如果用大写字母写第一个字母,则可以从任何地方调用该函数

相关问题