如果你想在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