首頁 >後端開發 >Golang >如何在 Go 中實現類似於猴子修補的行為以簡化測試?

如何在 Go 中實現類似於猴子修補的行為以簡化測試?

DDD
DDD原創
2024-12-08 17:19:10629瀏覽

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

Go 中的猴子修補:一種在運行時修改物件的方法

在Go 中,當使用缺乏介面的高度互連的程式碼庫時由於無法模擬或交換元件,依賴注入、測試或基準測試可能會變得具有挑戰性。然而,有一些類似於 Python 等腳本語言中的猴子修補技術,使您能夠在 Go 中運行時修改物件。

一種方法是建立一個自訂介面來包裝原始物件並允許在測試中進行模擬。例如,如果您有一個名為Concrete 的結構,它依賴名為somepackage 的套件:

type Concrete struct {
    client *somepackage.Client
}

您可以使用所需的方法定義自己的介面MyInterface:

type MyInterface interface {
    DoSomething(i int) error
    DoSomethingElse() ([]int, error)
}

然後,在模擬物件中實作此介面:

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
}

在您的測試中,您可以將模擬物件注入到Concrete 中並驗證其行為:

func TestDoSomething(t *testing.T) {
    mockConcrete := &MockConcrete{}
    c := &Concrete{client: mockConcrete}

    c.DoSomething(42)

    if !mockConcrete.DoSomethingCalled {
        t.Error("DoSomething was not called")
    }
}

另一種技術是將您想要模擬的類型嵌入到您自己的結構中。這允許您覆寫所需的模擬方法,同時保留對原始物件的其他方法的存取。例如:

type Concrete struct {
    *somepackage.Client
}

透過此方法,您可以直接呼叫非重寫方法,例如 Concrete 上的 DoSomethingNotNeedingMocking,而無需模擬它們。

以上是如何在 Go 中實現類似於猴子修補的行為以簡化測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn