Heim > Backend-Entwicklung > Golang > Wie kann ich den Effekt von Monkey Patching in Go für Tests und Benchmarking erzielen?

Wie kann ich den Effekt von Monkey Patching in Go für Tests und Benchmarking erzielen?

Linda Hamilton
Freigeben: 2024-12-11 12:26:11
Original
772 Leute haben es durchsucht

How Can I Achieve the Effect of Monkey Patching in Go for Testing and Benchmarking?

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()
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage