如何正确模拟导入的库?

时间:2017-02-15 07:06:38

标签: go mocking

我有一个导入:

import {
    "github.com/aws/aws-sdk-go/service/route53"
}

然后我将其用于AWS Route 53中的主机区域。 我看到我创建的代码现在可以使用当前设置正常工作。

为了简化开发过程,我想创建一个模拟我在开发时使用的库方法。

我在配置中有一个键,例如env="development"env="production"

我的计划是使用所需的方法添加我自己的route53对象,并在env开发时导入它。

我该如何做得更好? golang是否支持条件导入,如下所示:

if (env=="development") {
    import "./route53-mock"
} else {
    "github.com/aws/aws-sdk-go/service/route53"
}

3 个答案:

答案 0 :(得分:3)

Go不支持条件导入 - 至少不支持当前的稳定版本。

使用您需要使用的方法的interface非常适合解决此问题:

type TrafficPolicyLister interface {
   ListTrafficPolicies(*route53.ListTrafficPoliciesInput) (*route53.ListTrafficPoliciesOutput, error)
}

现在,您可以在以前使用route53.Route53的任何地方使用该界面。在生产中,您将传递类型为route53.Route53的对象(实现该接口)但在开发期间您可以传递模拟:

type TrafficPolicyListerMock struct {}

func (t *TrafficPolicyListerMock) ListTrafficPolicies(input *route53.ListTrafficPoliciesInput) (*route53.ListTrafficPoliciesOutput, error) {
    // return whatever you want your mock to return
}

答案 1 :(得分:1)

如果您想进行单元测试,请阅读answer of @csm

如果你想拥有一个开发环境(而不是单元测试),你应该看看minio,实际上是一个自托管的S3实现。您应该使用环境变量来注入S3端点。然后您可以自由地使用自己的minio服务器进行开发。

答案 2 :(得分:-1)

" golang是否支持条件导入[?]"。答:不。只需看一下语言规范。

"我该如何做得更好?"答案:通过你自己的包路由到route53的路由,这个包在mock和real route53之间切换,具体取决于你的环境/ build -tags / cmdlineargs / whatever。