Go 中的猴子修補
在Go 程式語言中,在處理不圍繞介面建構的程式碼時,模擬可能具有挑戰性。當結構直接互連且不存在依賴注入時,它會阻礙在不修改底層程式碼的情況下有效測試和基準測試的能力。
從像 Python 這樣的腳本語言中可能想到的一種技術是猴子修補,其中物件可以在運行時修改。雖然 Go 沒有直接物件修改的等效機制,但有其他方法可以實現類似的結果。
一種常見策略是建立自己的介面作為您希望模擬的結構的包裝器。這允許您在介面方法中實現所需的行為,同時保留底層結構中的原始功能。例如:
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() }
透過實作MyInterface,您現在可以為測試建立模擬實作:
// 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 }
@elithrar 在評論中建議的另一種方法是嵌入您希望在自己的結構中模擬的類型。這允許您有選擇地僅模擬需要它的方法:
type Concrete struct { *somepackage.Client }
透過嵌入 Client,您可以直接呼叫 DoSomethingNotNeedingMocking 等方法,而無需將它們新增至介面或為它們建立模擬。
這些技術為猴子修補提供了可行的替代方案,用於測試和基準測試不圍繞介面構建的程式碼。
以上是如何在Go中達到Monkey Patching的效果進行測試和基準測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!