Go语言 如何为dynamodbattribute.unmarshal函数编写mock

rbl8hiat  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(81)

让我们假设我有一个函数,它更新DDB中的项目并解组对象,如下所示。

func update(ddbClient) {
    updatedItem, err := ddbClient.updateItem(...)
    obj := new(MyCustomObj)
    err := dynamodbattribute.UnMarshalMap(updatedItem.Attributes, &obj)
    if err != nil {
     fmt.println("Error while unmarshalling")
   }
}

现在我需要写一个模拟测试,这样unmarshalMap就会抛出错误,我可以为此写一个测试。
请注意,我已经有一个UpdateItem的模拟,但它不能抛出非法的JSON,因为它可能会在我不想的地方中断。

mpgws1up

mpgws1up1#

您可以定义自己的接口结构来解析dynamo对象,然后模拟它。

type ItemParser interface {
   UnmarshalMap(map[string]interface{}, interface{}) error
}

type DynamoParser struct{}
(dynamo DynamoParser) func UnmarshalMap(attrs map[string]interface{},obj interface{}) error {
   return dynamodbattribute.UnMarshalMap(attr,obj)
}

type ErrorParser struct{
  Err error
}

(errParser ErrorParser ) func UnmarshalMap(map[string]interface{}, interface{}) error {
   return errParser.Err
}

type MyDatabase struct {
  itemParser ItemParser
}

(db MyDatabase) func update(ddbClient) {
    updatedItem, err := ddbClient.updateItem(...)
    obj := new(MyCustomObj)
    err := db.itemParser.UnMarshalMap(updatedItem.Attributes, &obj)
    if err != nil {
     fmt.println("Error while unmarshalling")
   }

}

虽然似乎你正在尝试行使所有的逻辑路径。不太清楚为什么需要这样做,但如果您正在跟踪代码覆盖率,我不建议您100%跟踪

相关问题