Golang Monkey Patching für nicht veränderbaren Code
In Go stellt das Fehlen von Änderungen an Laufzeitobjekten eine Herausforderung für das Testen von stark vernetztem Code dar, dem es an Abhängigkeiten mangelt Injektion oder Schnittstellenprogrammierung. Um diese Einschränkung zu umgehen, sollten Sie den folgenden Ansatz in Betracht ziehen:
Erstellen einer Mocking-Wrapper-Schnittstelle
Definieren Sie Ihre eigene Schnittstelle, die die ursprünglichen Strukturen umschließt. Zum Beispiel:
type MyInterface interface { DoSomething(i int) error DoSomethingElse() ([]int, error) }
Verwenden einer Adapterstruktur
Implementieren Sie die Wrapper-Schnittstelle in einer neuen Struktur, die die Implementierung der ursprünglichen Struktur anpasst:
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() }
Testen mit dem Wrapper
Sie können jetzt verspotten die Concrete-Struktur in Unit-Tests, weil sie sich an eine Schnittstelle hält:
// Mock Concrete mock := &MockMyInterface{} c := Concrete{mock} // Call mock method err := c.DoSomething(10)
Einbetten des Originaltyps
Wie von @elithrar vorgeschlagen, können Sie auch das Original einbetten Geben Sie ein, um selektiv nur notwendige Methoden zu verspotten:
type Concrete struct { *somepackage.Client }
In diesem Fall können Sie immer noch auf die ursprüngliche Implementierung von Methoden zugreifen, die dies nicht tun muss verspottet werden:
c := Concrete{&somepackage.Client{}} c.DoSomethingNotNeedingMocking() // Calls the original implementation
Das obige ist der detaillierte Inhalt vonWie kann ich unveränderbaren Go-Code zum Testen nachahmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!