單元測試中的模擬是在單元測試中建立測試替身以取代外部相依性的技術,允許隔離和測試特定函數。基本原則是:定義介面、建立模擬、注入模擬。使用 GoogleMock 模擬,需要定義介面、建立模擬、在測試函數中註入它。使用 testify/mock 模擬,需要宣告 MockClient 結構體、為 Get 方法設定期望值、在測試函數中設定模擬。
在單元測試中,模擬(mocking)是一種創建測試替身的技術,用於替換被測程式碼中的外部依賴。這允許您隔離和測試特定函數,而無需與其他元件互動。
模擬的基本原則是:
考慮以下使用net/http
套件的函數:
func GetPage(url string) (*http.Response, error) { client := http.Client{} return client.Get(url) }
要測試此函數,我們需要模擬http.Client
,因為它是一個外部相依性。
可以使用 GoogleMock 函式庫進行模擬。首先,我們定義要模擬的介面:
type MockClient interface { Get(url string) (*http.Response, error) }
然後,我們可以使用new(MockClient)
建立模擬,並在測試函數中註入它:
import ( "testing" "github.com/golang/mock/gomock" ) func TestGetPage(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() client := mock.NewMockClient(ctrl) client.EXPECT().Get("http://example.com").Return(&http.Response{}, nil) resp, err := GetPage("http://example.com") assert.NoError(t, err) assert.NotNil(t, resp) }
testify/mock 函式庫也提供了模擬功能。使用範例如下:
import ( "testing" "github.com/stretchr/testify/mock" ) type MockClient struct { mock.Mock } func (m *MockClient) Get(url string) (*http.Response, error) { args := m.Called(url) return args.Get(0).(*http.Response), args.Error(1) } func TestGetPage(t *testing.T) { client := new(MockClient) client.On("Get", "http://example.com").Return(&http.Response{}, nil) resp, err := GetPage("http://example.com") assert.NoError(t, err) assert.NotNil(t, resp) }
以上是Go 函數單元測試中的模擬技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!