我构建了以下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个函数。
为什么编译器不进行关联?
如果您还没有找到解决此问题的方法,我建议您围绕数据库调用创建一个新的API,它实际上会返回您想要的内容。这意味着您需要应用一些判断,但是在您对问题进行一些思考之后,您的测试将变得更加清晰。
例如,如果您的数据库包含这样的表
+------------+----------+-----+-------------------+
| EmployeeID | Name | Age | Salary |
+------------+----------+-----+-------------------+
| 123 | Kara Bob | 28 | 1 Million Dollars |
+ ...
创建这样的界面
type Employee interface {
GetEmployeeId() int
GetName() string
...
}
然后创建一个调用SQL数据库的真实版本,然后创建一个带有struct字段的假数据库。