go沒有像其他語言那樣具有內置的模擬框架(例如,Java的Mockito)。但是,您可以使用接口和結構有效地創建模擬和存根。關鍵是定義代表您代碼相互作用的依賴項的接口。然後,您為您的實際代碼創建具體實現,並分開測試的模擬實現。
讓我們用一個示例說明:想像一下您具有與數據庫交互的函數:
<pre class="brush:php;toolbar:false"> <pre class="brush:php;toolbar:false"> <pre class="brush:php;toolbar:false"> type database database界面ata(id int)(字符串,錯誤){// ...實際數據庫交互...返回數據庫的“數據”;數據,nil}
現在,讓我們創建一個模擬:
<pre class="brush:php;toolbar:false"> <code class="“" go> type mockdatabase struct {getDatafunc func(int)(string,error)} func(m *mockdatabase) ,nil //或返回默認值/錯誤} </code>
在您的測試中,您可以使用 oigddatabase
控制 getdata
:
<pre class="brush:php;toolbar:false"> <pre class="brush:php;toolbar:false"> <pre class="brush:php;toolbar:false"> <pre class="brush:php;toolbar:false"> <pre class="brush:php;toolbar:false"> <pre class="brush:php;toolbar:false"> <pre class="brush:php;toolbar:false"> <pre class="brush:php;toolbar:false"> <pre class="brush:php;toolbar:false"> <pre class="brush:php;toolbar:false"> <pre int nil assert.error>
此示例顯示一個簡單的模擬。存根更簡單;他們通常在模擬函數中返回沒有復雜邏輯的預定值。
mockgetData
)。testify/assert
make writing assertions in your tests much cleaner and more readable.Mocks are the primary tool for isolating units of code in Go testing.通過用模擬替換實際依賴關係,您可以消除可能影響您的測試結果的外部因素。這樣可以確保您的測試僅關注正在測試的單元的行為。該測試可以驗證 ProcessData
的行為,而不管數據庫的狀態或可用性如何。這種隔離是編寫可靠且可重複的單元測試的關鍵。
,而Go的標準庫無法提供專用的模擬框架,幾個第三方的庫可以簡化該過程:
gomock
:另一個強大的競爭者, gomock
提供了更強大且靈活的模擬解決方案。它允許更高級的模擬場景,包括期望設置和驗證。但是,它需要更多的設置。
在這些庫之間進行選擇通常取決於項目的複雜性和偏好。對於更簡單的項目,手動創建模擬可能就足夠了。對於較大的項目或複雜的模擬要求, stidify/mock
或 gomock
可以顯著提高效率並降低樣板。
以上是如何編寫模擬對象和存根以進行測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!