golang:为现有类型构建接口以使代码可测试

问题描述 投票:0回答:1

我构建了以下2个接口,以便生成我的代码,这使得调用sql包,testable:

type Database interface {
    Close() error
    Query(string, ...interface{}) (DatabaseRows, error)
}

type DatabaseRows interface {
    Close() error
    Next() bool
    Scan(...interface{}) error
}

我要测试的实际代码是:

func getDatabase(connectionString string) (db Database, err error) {
    if db , err = sql.Open("mysql", connectionString); err != nil {
        glog.V(0).Infof("Error %s", err)
    }
    return
}

但这无法编译:

* sql.DB没有实现Database(Query方法的类型错误)

有查询(字符串,...接口{})(* sql.Rows,错误)

想查询(字符串,...接口{})(DatabaseRows,错误)

如果我理解正确的话,它告诉我它不能返回预期DatabaseRow的* Row,即使Rows struct in正在实现我在DatabaseRows接口中声明的所有3个函数。

为什么编译器不进行关联?

go
1个回答
0
投票

如果您还没有找到解决此问题的方法,我建议您围绕数据库调用创建一个新的API,它实际上会返回您想要的内容。这意味着您需要应用一些判断,但是在您对问题进行一些思考之后,您的测试将变得更加清晰。

例如,如果您的数据库包含这样的表

+------------+----------+-----+-------------------+
| EmployeeID | Name     | Age | Salary            |
+------------+----------+-----+-------------------+
| 123        | Kara Bob | 28  | 1 Million Dollars |
+ ...

创建这样的界面

type Employee interface {
    GetEmployeeId() int
    GetName() string
    ...
}

然后创建一个调用SQL数据库的真实版本,然后创建一个带有struct字段的假数据库。

© www.soinside.com 2019 - 2024. All rights reserved.