3 回答

TA貢獻1851條經驗 獲得超5個贊
您可以為此使用 gomock?setarg函數
yourPackage.EXPECT().insert(&pointer).SetArg(0,?newPointer)

TA貢獻1875條經驗 獲得超3個贊
您可以使用提供的Eq()
matcher來實現此目的,它在內部調用reflect.DeepEqual()
預期值和實際值;根據此方法的文檔:
如果使用 Go 的 == 運算符相等或者它們指向深度相等的值,則指針值深度相等。
假設我們有一個函數依賴于帶有指針參數的接口方法:
package resource
type ServiceRequest struct {
? ? Name? string
? ? Owner *string // this is a pointer so it can be omitted with `nil`
}
type Model struct {
? ? // resource model...
}
type ResourceService interface {
? ? Fetch(req *ServiceRequest) (Model, error)
}
type getResourceHandler struct {
? ? resourceService ResourceService
}
type GetResourceEvent struct {
? ? Resource string
? ? Owner? ? *string
}
func NewResourceHandler(resourceService ResourceService) *getResourceHandler {
? ? return &getResourceHandler{resourceService}
}
func (h *getResourceHandler) Handle(event GetResourceEvent) (Model, error) {
? ? return h.resourceService.Fetch(&ServiceRequest{event.Resource, event.Owner})
}
我們可以Eq()在針對生成的接口模擬設置期望時使用匹配器ResourceService:
package test
import (
? ? "testing"
? ? "github.com/golang/mock/gomock"
? ? "github.com/stretchr/testify/assert"
? ? "github.com/org/repo/internal/mock"
? ? "github.com/org/repo/internal/resource"
)
func optionalString(str string) *string {
? ? return &str
}
func Test_GetResourceHandler_ReturnsResultFromService(t *testing.T) {
? ? resourceName := "my-resource"
? ? owner := optionalString("Joe Bloggs")
? ? resourceReq := &resource.ServiceRequest{resourceName, owner}
? ? event := resource.GetResourceEvent{resourceName, owner}
? ? model := resource.Model{ /* fields here... */ }
? ? ctrl := gomock.NewController(t)
? ? mockResourceService := mock.NewMockResourceService(ctrl)
? ? handler := resource.NewResourceHandler(mockResourceService)
? ? mockResourceService.EXPECT().Fetch(gomock.Eq(resourceReq)).Return(model, nil)
? ? res, err := handler.Handle(event)
? ? assert.Nil(t, err)
? ? assert.Equal(t, model, res)
}
如果您在測試或被測單元中更改服務請求的內容,您將看到測試不再通過。否則,盡管測試和被測單元有各自的指向單獨ServiceRequest{}值的指針,它仍然會通過。

TA貢獻1876條經驗 獲得超5個贊
看來你不必使用gomock來測試該task方法。
既然你有一個接口,為什么不直接創建該接口的模擬實現,例如:
type dummy struct{
callCount int
}
func (d *dummy) Double(i *int) error {
d.callCount++
return nil
}
d := dummy{}
j := job{a: &d}
got := j.task(3)
if d.callCount != 1 {
// XXX
}
- 3 回答
- 0 關注
- 188 瀏覽
添加回答
舉報