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
DDDOriginal
2024-12-08 17:19:10688Durchsuche

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
}

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!

Stellungnahme:
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