有什么办法可以监视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中,有什么方法可以隔离这些依赖关系?
答案 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时,如果您将小写第一个字母,则可以将函数设为私有(它们只能从同一包中调用)。
如果用大写字母写第一个字母,则可以从任何地方调用该函数