我在 Go 中為相當常見的用例/模式編寫單元測試時遇到困難。如果你愿意的話,想象一下這樣的事情:package maintype Resource struct { name string}type ResourceManager interface { GetResource(id string) (*Resource, error) GetAllResources() ([]*Resource, error)}type ResourceManagerImpl struct {}func (r *ResourceManagerImpl) GetResource(id string) (*Resource, error) { resource := &Resource{} var err error // fetch resource. // ... return resource, err}func (r *ResourceManagerImpl) GetAllResources() ([]*Resource, error) { var resources []*Resource var err error // for _, id := range ids { // resource = r.GetResource(id) // resources = append(resources, resource) // } return resources, err}根據需要重復GetAllResources調用是一種常見的模式。GetResource我可以使用gomockortestify來測試 的所有排列GetResource。但是,在測試時GetAllResource,我想模擬GetResource。否則,測試將變成一場噩夢。easymock這就是在 Java 中使用部分模擬的方式mockito。但是,尚不清楚如何在 Golang 中實現同樣的效果。具體來說,我找不到如何部分模擬struct. 大多數建議都圍繞著打破這樣的struct問題,但在這種情況下,這struct已經是最低限度了。ResourceManager為了測試的目的,不要破壞接口(分為單個和多個)似乎是一個公平的要求,因為這沒有多大意義,充其量也是笨拙的,而且隨著更多此類方法進入接口,也無法很好地擴展。
1 回答

動漫人物
TA貢獻1815條經驗 獲得超10個贊
遇到這種情況我是這樣處理的:
func (r *ResourceManagerImpl) GetAllResources() ([]*Resource, error) {
return getAllResources(r)
}
func getAllResources(r ResourceManager) ([]*Resource,error) {
...
}
然后您進行測試getAllResources,而不是GetAllResources使用模擬的r. GetAllResources如果您遇到從代碼調用并且必須模擬的情況GetAllResources,您可以執行以下操作:
var getAllResources=func(r ResourceManager) ([]*Resource,error) {
...
}
并將 getAllResources 分配給測試實例。
- 1 回答
- 0 關注
- 165 瀏覽
添加回答
舉報
0/150
提交
取消