在Golang测试中使用接口来模拟服务

91 阅读1分钟

如果你想在Golang中编写单元测试时模拟服务,你可以简单地使用接口。如果你不希望你的测试调用 "真实 "的代码,那么模拟往往是必要的。我们的例子是对Twitter进行认证并向其发布消息。

结构

└── internal

文件

app.go

package app

twitter.go

package twitter

app_test.go

package app

结果

正如你在下面看到的,当我们运行测试时,它实际上调用了真正的Twitter API和真正的配置参数。这是你绝对要避免的。让我们在下一阶段解决这个问题。

=== RUN   TestApp_SendMessage

结构

└── internal

文件

app.go

我们用twitter.SocialMedia 接口类型取代了具体的twitter.Twitter 类型。

package app

twitter.go

我们引入了SocialMedia 接口类型。

package twitter

mock/twitter.go

我们创建了这个模拟版本,它满足了twitter.SocialMedia 接口类型的签名。

package mock

app_test.go

我们将mock.TwitterMock 作为依赖关系注入。

package app

结果

正如你在下面看到的,我们的测试与模拟服务进行了交互。如果有意义的话,你甚至可以在模拟文件中硬编码值。

=== RUN   TestApp_SendMessage