为了使代码更易于测试,强调使用接口而不是具体类型。然而,我想知道为什么在sql包中的DB或Rows等类型没有这样做。为了模拟这些依赖项,我不得不创建自己的接口,以便编写单元测试(非集成测试)。难道DB面向的代码不应该这样测试吗?
为了使代码更易于测试,强调使用接口而不是具体类型。然而,我想知道为什么在sql包中的DB或Rows等类型没有这样做。为了模拟这些依赖项,我不得不创建自己的接口,以便编写单元测试(非集成测试)。难道DB面向的代码不应该这样测试吗?
将接口暴露在公共API中,而不是具体类型,会增加向接口添加方法时破坏他人代码的风险。
例如,可以查看os.File
。如果os.File
是一个接口,那么它将是一个具有17个公共方法的接口。添加第18个方法将破坏所有定义了自己的类型来实现os.File
接口的人。相比之下,向当前的os.File
结构添加第18个方法不会破坏任何采用io.Reader
、io.Writer
或任何其他定义了os.File
方法子集的接口的方法。这也不会破坏模拟这些io.Reader
和io.Writer
接口的测试代码。
database/sql
的东西:go-sqlmock,也许可以看一下? - Elias Van Ootegem