我按照本教程模拟数据库连接。但是当我尝试更进一步并为 Query 方法的返回类型实现一个接口时,我得到一个错误。
这是不适用于MockDB但适用于的工作版本main:
// The DB interface
type SQLDB interface {
Query(query string, args ...interface{}) (*sql.Rows, error)
}
type MockDB struct {
// ...
}
func (m *MockDB) Query(query string, args ...interface{}) (SQLRows, error) {
// var row MockRows
// ...
return rows, nil
}
// #################################
// The Rows interface
type SQLRows interface {
Next() bool
Scan(dest ...interface{}) error
}
type MockRows struct {
// ...
}
func (m *MockRows) Next() bool {
// ...
return true
}
func (m *MockRows) Scan(dest ...interface{}) error {
// ...
return nil
}
// #################################
// Usage
func GetStuff(db SQLDB) (*sql.Rows, error) {
results := db.Query("query")
// ...
return results, nil
}
// #################################
// Main
var db SQLDB
func main() {
db = sql.Open("driver", "uri")
results := GetResult(db)
}
// #################################
// Test
func TestGetStuff(t *testing.T) {
mockDB = new(MockDB)
results := GetResult(mockDB)
// ...
}
这适用于 main,但不适用于测试,并且在运行测试时出现以下错误:
*MockDB does not implement SQLDB (wrong type for Query method)
have Query(string, ...interface {}) (SQLRows, error)
want Query(string, ...interface {}) (*sql.Rows, error)
这是适用于MockDB但不适用的版本main:
// The DB interface
type SQLDB interface {
Query(query string, args ...interface{}) (SQLRows, error)
}
type MockDB struct {
// ...
}
func (m *MockDB) Query(query string, args ...interface{}) (SQLRows, error) { // <<<<<< Changed
// var row MockRows
// ...
return rows, nil
}
// #################################
// The Rows interface
type SQLRows interface {
Next() bool
Scan(dest ...interface{}) error
}
type MockRows struct {
// ...
}
这是错误:
*sql.DB does not implement SQLDB (wrong type for Query method)
have Query(string, ...interface {}) (*sql.Rows, error)
want Query(string, ...interface {}) (SQLRows, error)
我怎样才能使它适用于两者?还是根本做不到?
慕虎7371278
相关分类