針對不可修改程式碼的Golang Monkey 修補
在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() }
測試包裝器
您現在可以在單元測試中模擬特定結構,因為它遵循一個介面:
// Mock Concrete mock := &MockMyInterface{} c := Concrete{mock} // Call mock method err := c.DoSomething(10)
嵌入原始類型
按照@elithrar的建議,您還可以嵌入原始類型以選擇性地模擬僅必要的方法:
type Concrete struct { *somepackage.Client }
在這種情況下,您仍然可以訪問不需要模擬的方法的原始實作:
c := Concrete{&somepackage.Client{}} c.DoSomethingNotNeedingMocking() // Calls the original implementation
以上是如何模擬不可修改的 Go 程式碼進行測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!