2017-03-16 51 views
1

我對golang相當陌生,而且我正在爲一個簡單的任務而努力。如何在Golang中只模擬特定的方法

我在golang

type struct A { 
} 

func (s *A) GetFirst() { 
    s.getSecond() 
} 

func (s *A) getSecond() { 
    // do something 
} 

以下級和我想的卻是我需要重寫getSecond()編寫一些測試它。我試圖做到以下幾點在我的測試文件

type Ai interface { 
    getSecond() 
} 

type testA struct { 
    A 
} 

func (s *testA) getSecond() { 
    // do nothing 
} 

func TestA(t *testing.T) { 
    a := &A{} 
    t := &testA{A: a} 
    t.GetFirst() 
} 

這裏的想法是通過嵌入然而,這似乎並沒有工作,暴露getSecond()方法的接口和覆蓋。測試仍然調用getSecond()的原始實現,而不是我的嘲弄。當然

一個解決辦法是建立一個合適的接口,一個包含getFirst()getSecond(),然後在測試創建一個struct實現兩種情況:getFirst()調用原始的實現和getSecond()啞,但是我覺得這是非常麻煩,不正確的做事方式。

另一種可能性是將實際實現中的getSecond()分配給變量並覆蓋測試中的變量,但我也覺得這樣做有點奇怪,只是爲了簡單的覆蓋。

我是否對此有錯?有沒有更簡單的方法來使用golang來做到這一點?

+0

你爲什麼要嘲笑兩種方法?什麼是真正的原因?真正有效的是:構建一個'A'(這很容易,因爲你可以訪問所有血腥的內部),然後檢查'getFirst()'和'getSecond()'產生期望的結果。沖洗並重復。看看標準庫是如何完成的。也許你仍然受其他語言的影響,'getFirst()'使用'getSecond()',這讓你相信你必須模擬'getSecond()'。不,你可以通過'A'的狀態來控制'getSecond()'的作用。並且請:Go沒有getter(而不是golang)。 – Volker

+0

其實這些都不是getter,我只是選擇了像這個例子那樣的函數:) 這裏的問題在於getFirst會調用getSecond來執行在單元測試情況下不起作用的東西。 – ByteFlinger

+0

更精確。 A有一個baseUrl,getFirst()執行一個http請求,但是在做這件事之前,需要根據請求類型重寫url基本域以包含子域,這就是getSecond()所做的。這會導致httptest包出現問題,因爲您最終得到http://subdomain.127.0.0.1 – ByteFlinger

回答

1

根據this answer,您無法真正覆蓋golang中的方法。但是,正如你指出的那樣,你可以爲「getSecond方法」設置一個單獨的接口,並且在你的測試用例中有一個實現,在你的實際代碼中有一個實現。

type s interface{ 
    getSecond() 
} 

type A struct{ 
    s 
} 

type a struct{ 

} 

func (s *A) GetFirst() { 
    s.getSecond() 
} 

func (s a) getSecond() { 
    // do something 
} 

//Use a 
A{a{}} 
在測試

然後有不同的實現的 'A'

type struct ta { 

} 
func (s ta) getSecond() { 
    // do nothing 
} 

A{ta{}} 
+0

鑑於我在我的問題中提供的數據量,我認爲這是非常可接受的解決方案。那麼,如果您可以忍受不測試用於粘合整個事物的方法,並且不添加額外的邏輯,Volker就會在我的問題下面發表評論。 – ByteFlinger

相關問題