Я построил следующие 2 интерфейса, чтобы сделать свой код, который делает вызовы пакета sql, тестируемыми:
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 не реализует базу данных (неправильный тип для метода запроса)
есть запрос (строка, ... интерфейс {}) (* sql.Rows, ошибка)
хотите Query (строка, ... интерфейс {}) (DatabaseRows, ошибка)
Если я правильно понимаю, он сообщает мне, что не может вернуть * Row там, где ожидается DatabaseRow, даже если структура Rows в реализует все 3 функции, которые я объявил в интерфейсе DatabaseRows.
Почему компилятор не создает эту ассоциацию?
*sql.Rows
реализуетDatabaseRows
. Проблема в том, что сигнатуры методов различаются, что приводит к разным наборам методов. - person JimB   schedule 15.12.2016