我有以下界面:
type Datastore interface {
Get(key interface{}, castTo interface{}) error
}
如您所见,我将castTo作为参数,而不是返回它。用法就像
var user *User
err:= Get("123-456", &user)
因此将类型传递给函数。原因是它具有以下实现:
func (ddb *DynamoDB) Get(key interface{}, castTo interface{}) error {
...
return dynamodbattribute.UnmarshalMap(result.Item, &castTo)
}
在实现中,它使用aws dynamodb SDK中的功能,如下所示:
func UnmarshalMap(m map[string]*dynamodb.AttributeValue, out interface{}) error {
return NewDecoder().Decode(&dynamodb.AttributeValue{M: m}, out)
}
接口变得非常通用。但是我现在面临的挑战是如何模拟界面。因为我正在为其编写单元测试的某些其他功能使用了Get接口。
func (r *repository) Get(id string) (*User, error) {
var user *User
if err := r.datastore.Get(id, &user); err != nil {
return nil, err
}
...
return account, nil
}
在单元测试期间,我需要模拟datastore.Get()
以返回一些假用户,然后将其与预期用户进行比较。
我正在使用conterfeiter进行模拟,它只能模拟return
的结果。
有人遇到类似问题或知道如何解决吗?