为了账号安全,请及时绑定邮箱和手机立即绑定

Golang:在调用 Init 方法之前模拟接口方法

Golang:在调用 Init 方法之前模拟接口方法

Go
慕标琳琳 2022-11-23 19:27:00

我如何模拟在包init()方法中调用的东西?


例如:


主程序



var myService MyService = myservicepkg.New()


func init(){

   response := myService.get()

}


func otherMethod(){

   //do something

}

主测试.go


func Test_otherMethod(){

  ctrl := NewController(t)

  defer ctrl.Finish()

  myServiceMock = myservicepkg.NewMock(myService)


  myServiceMock.EXPECT().get().return("success")

}

问题是init()在服务被模拟替换之前被调用。


查看完整描述

3 回答

?
烙印99

TA贡献1522条经验 获得超12个赞

这是使用可变全局状态的问题。

我的建议是添加一个标志以在某些条件下不运行它,或者公开一个可以在内部测试中恢复/更新这个全局变量的私有函数。

这反映了您的设计:如果测试起来很复杂,也许您应该重构。

创建一个带有字段服务的对象应用程序,在构造函数/构建器/工厂上创建将更容易测试。

init的用法很讲究。除了将驱动程序注册到 sql 包中,我从不使用它(可能是为了处理标志)。

也许你可以在你的设计中添加更多的 OO


查看完整回答
反对 回复 5天前
?
开心每一天1111

TA贡献1540条经验 获得超11个赞

您将需要调用otherMethod()内部init()。否则之前不能调用它init()



查看完整回答
反对 回复 5天前
?
RISEBY

TA贡献1570条经验 获得超5个赞

我找到了一个解决方法,您可以阻止初始化代码在您的测试中执行,并像这样隔离地测试该方法:


func init(){

  if len(os.Args) > 0 && strings.HasSuffix(os.Args[0], ".test") {

    log.Printf("skipping jwt.init() for testing")

  } else if len(os.Args) > 1 && strings.HasSuffix(os.Args[1], "-test.run") {

    log.Printf("skipping jwt.init() for testing")

  } else { 

    response := myService.get()

  }

}

这将阻止调用 init 服务调用。


查看完整回答
反对 回复 5天前

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信