Monkey Patching in Go: Eine Möglichkeit, Objekte zur Laufzeit zu ändern
In Go, wenn mit einer stark vernetzten Codebasis gearbeitet wird, der es an Schnittstellen mangelt oder Abhängigkeitsinjektion, Tests oder Benchmarking können zu einer Herausforderung werden, da Komponenten nicht simuliert oder ausgetauscht werden können. Es gibt jedoch Techniken, die dem Monkey-Patching in Skriptsprachen wie Python ähneln und es Ihnen ermöglichen, Objekte zur Laufzeit in Go zu ändern.
Ein Ansatz besteht darin, eine benutzerdefinierte Schnittstelle zu erstellen, die das ursprüngliche Objekt umschließt und das Verspotten in Tests ermöglicht . Wenn Sie beispielsweise eine Struktur namens Concrete haben, die von einem Paket namens somepackage abhängt:
type Concrete struct { client *somepackage.Client }
Sie können Ihre eigene Schnittstelle MyInterface mit den gewünschten Methoden definieren:
type MyInterface interface { DoSomething(i int) error DoSomethingElse() ([]int, error) }
Dann Implementieren Sie diese Schnittstelle in einem Scheinobjekt:
type MockConcrete struct { DoSomethingCalled bool DoSomethingElseCalled bool } func (m *MockConcrete) DoSomething(i int) error { m.DoSomethingCalled = true return nil } func (m *MockConcrete) DoSomethingElse() ([]int, error) { m.DoSomethingElseCalled = true return []int{}, nil }
In Ihren Tests können Sie das Scheinobjekt in Concrete einfügen und es überprüfen Verhalten:
func TestDoSomething(t *testing.T) { mockConcrete := &MockConcrete{} c := &Concrete{client: mockConcrete} c.DoSomething(42) if !mockConcrete.DoSomethingCalled { t.Error("DoSomething was not called") } }
Eine andere Technik besteht darin, den Typ, den Sie verspotten möchten, in Ihre eigene Struktur einzubetten. Dadurch können Sie die gewünschten Methoden zum Verspotten überschreiben und gleichzeitig den Zugriff auf die anderen Methoden des ursprünglichen Objekts behalten. Zum Beispiel:
type Concrete struct { *somepackage.Client }
Mit diesem Ansatz können Sie nicht überschriebene Methoden wie DoSomethingNotNeedingMocking on Concrete direkt aufrufen, ohne sie verspotten zu müssen.
Das obige ist der detaillierte Inhalt vonWie kann ich für einfachere Tests ein Monkey-Patching-ähnliches Verhalten in Go erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!