我對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來做到這一點?
你爲什麼要嘲笑兩種方法?什麼是真正的原因?真正有效的是:構建一個'A'(這很容易,因爲你可以訪問所有血腥的內部),然後檢查'getFirst()'和'getSecond()'產生期望的結果。沖洗並重復。看看標準庫是如何完成的。也許你仍然受其他語言的影響,'getFirst()'使用'getSecond()',這讓你相信你必須模擬'getSecond()'。不,你可以通過'A'的狀態來控制'getSecond()'的作用。並且請:Go沒有getter(而不是golang)。 – Volker
其實這些都不是getter,我只是選擇了像這個例子那樣的函數:) 這裏的問題在於getFirst會調用getSecond來執行在單元測試情況下不起作用的東西。 – ByteFlinger
更精確。 A有一個baseUrl,getFirst()執行一個http請求,但是在做這件事之前,需要根據請求類型重寫url基本域以包含子域,這就是getSecond()所做的。這會導致httptest包出現問題,因爲您最終得到http://subdomain.127.0.0.1 – ByteFlinger