登录
首页 >  Golang >  Go问答

在单元测试中模拟 main() 函数调用的返回值

来源:stackoverflow

时间:2024-03-23 13:00:34 109浏览 收藏

单元测试中,模拟 `main()` 函数对外部服务的调用可以提升测试的可控性。本文探讨了在 Go 语言中如何模拟 `main()` 函数中对 `aws secrets manager` 的网络调用返回值。

问题内容

main.go 中,我有一些代码可以对 aws secrets manager 进行网络调用。

func main() {
    secretname := os.getenv("dynamo_secret")
    credentials, err := getsecret(secretname)
    if err != nil {
        logger.errorf("failed to retrieve secret from aws secrets manager %+v\n", err)
        panic(err)
    }
    router, err := setuprouter(credentials)

getsecret(secretname) 函数在后台对 aws secrets 管理器进行网络调用。在我的 main 单元测试中,我有以下代码。

func TestMainProgram(t *testing.T) {
    defer mockStartServer(nil)()
    defer mockSetupRouter(mux.NewRouter(), nil)()
    main()
    t.Log("Everything is perfect.")
}

运行单元测试时,我想模拟对 aws secrets manager 的网络调用。是否可以模拟 getsecret(secretname) 的返回值?在 java 上下文中,我尝试使用 mockitowhen(functioniscalled).thenreturn(mockvalue) 语法执行类似的操作。


解决方案


您可以使用函数变量将其设置为其他值以进行测试:

func defaultgetsecret(secretname string) (credentials, error) {...}

var getsecret=defaultgetsecret

func main() {
   ...
   credentials, err:=getsecret(...)
}

在您的测试中,您可以更改 getsecret 以指向其他内容:

func TestMain(t *testing.T) {
   getSecret=func(secretName string) (Credentials,error) {
      return mockCredentials,nil
   }
   main()
}

理论要掌握,实操不能落!以上关于《在单元测试中模拟 main() 函数调用的返回值》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>