Heim > Backend-Entwicklung > Golang > Wie kann ich für einfachere Tests ein Monkey-Patching-ähnliches Verhalten in Go erreichen?

Wie kann ich für einfachere Tests ein Monkey-Patching-ähnliches Verhalten in Go erreichen?

DDD
Freigeben: 2024-12-08 17:19:10
Original
661 Leute haben es durchsucht

How Can I Achieve Monkey Patching-like Behavior in Go for Easier Testing?

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

Sie können Ihre eigene Schnittstelle MyInterface mit den gewünschten Methoden definieren:

type MyInterface interface {
    DoSomething(i int) error
    DoSomethingElse() ([]int, error)
}
Nach dem Login kopieren

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

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

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage