Monkey Patching in Go
In der Programmiersprache Go kann Mocking eine Herausforderung darstellen, wenn es um Code geht, der nicht um Schnittstellen herum strukturiert ist. Wenn Strukturen direkt miteinander verbunden sind und keine Abhängigkeitsinjektion vorhanden ist, behindert dies die Möglichkeit, effektiv zu testen und Benchmarks durchzuführen, ohne den zugrunde liegenden Code zu ändern.
Eine Technik, die Ihnen bei Skriptsprachen wie Python vielleicht in den Sinn kommt, ist Monkey Patching Objekte können zur Laufzeit geändert werden. Obwohl Go über keinen gleichwertigen Mechanismus zur direkten Objektänderung verfügt, gibt es alternative Ansätze, um ähnliche Ergebnisse zu erzielen.
Eine gängige Strategie besteht darin, eine eigene Schnittstelle als Wrapper um die Strukturen zu erstellen, die Sie verspotten möchten. Dadurch können Sie das gewünschte Verhalten in den Schnittstellenmethoden implementieren und gleichzeitig die ursprüngliche Funktionalität in der zugrunde liegenden Struktur beibehalten. Zum Beispiel:
type MyInterface interface { DoSomething(i int) error DoSomethingElse() ([]int, error) } type Concrete struct { client *somepackage.Client } func (c *Concrete) DoSomething(i int) error { return c.client.DoSomething(i) } func (c *Concrete) DoSomethingElse() ([]int, error) { return c.client.DoSomethingElse() }
Durch die Implementierung von MyInterface können Sie jetzt Scheinimplementierungen für Ihre Tests erstellen:
// MockMyInterface implements MyInterface for testing purposes type MockMyInterface struct { mockedDoSomethingError error mockedDoSomethingElseResult []int } func (m *MockMyInterface) DoSomething(i int) error { return m.mockedDoSomethingError } func (m *MockMyInterface) DoSomethingElse() ([]int, error) { return m.mockedDoSomethingElseResult, nil }
Ein anderer Ansatz, der von @elithrar in den Kommentaren vorgeschlagen wurde, besteht darin, das einzubetten Typ, den Sie in Ihrer eigenen Struktur verspotten möchten. Dadurch können Sie selektiv nur die Methoden verspotten, die dies erfordern:
type Concrete struct { *somepackage.Client }
Durch die Einbettung des Clients können Sie Methoden wie DoSomethingNotNeedingMocking direkt aufrufen, ohne sie der Schnittstelle hinzuzufügen oder Mocks für sie zu erstellen.
Diese Techniken bieten praktikable Alternativen zum Monkey-Patching zum Testen und Benchmarking von Code, der nicht um Schnittstellen herum strukturiert ist.
Das obige ist der detaillierte Inhalt vonWie kann ich den Effekt von Monkey Patching in Go für Tests und Benchmarking erzielen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!