При тестировании методов базы данных я создал минимальную оболочку над пакетом database/sql, чтобы позволить мне протестировать интерфейс, а не сложную, если не невозможную, настройку конкретных классов. Но, я получаю следующее сообщение об ошибке при попытке макете sql.Stmt:Mocking database/sql structs в Go
cannot use *sql.Stmt as type IStmt in return argument:
*sql.Stmt does not implement IStmt (wrong type for Query method)
have Query(...interface {}) (*sql.Rows, error)
want Query(...interface {}) (IRows, error)
Вот мои интерфейсы:
type IStmt interface {
Query(args ...interface{}) (IRows, error)
QueryRow(args ...interface{}) IRow
}
type IRows interface {
Columns() ([]string, error)
Next() bool
Close() error
Scan(dest ...interface{}) error
Err() error
}
А вот проблемный метод:
func (c *DbConnection) Prepare(query string) (IStmt, error) {
return c.conn.Prepare(query)
}
Я знаю, что одна из красивейших вещей о Go заключается в том, что вы можете создать свой собственный интерфейс, и любая структура, которая его реализует, автоматически «реализует» ее, не используя ключевое слово в java или нас e точка с запятой, как в C#, в подкласс. Почему он не работает с этим типом возврата? Я делаю что-то неправильно?
'* sql.Rows' не реализует' IStmt', поэтому вы не можете его вернуть. Измените интерфейс, чтобы вернуть конкретный тип (самое быстрое исправление). Я также предлагаю прочитать [Effective Go] (https://golang.org/doc/effective_go.html#interface-names) и посмотреть на ваше имя интерфейса (т. Е. 'Queryer' или' Queryable') и/или читать https : //robots.thoughtbot.com/interface-with-your-database-in-go – elithrar
Но * sql.Stmt реализует метод Query и QueryRow, как и мой. 'Query (args ... interface {}) (* Строки, ошибка)' и 'QueryRow (args ... interface {}) * Row'. Конечно, я использую интерфейс для представления '* sql.Rows' и' * sql.Row', но используемые мной подписи метода точно совпадают. Если я изменю эти методы для возврата '* sql.Rows' и' * sql.Row' соответственно, он будет работать. Если Go не может обрабатывать вложенный интерфейс из возвращаемого типа, это настоящий позор! –