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

Mocking a function return value called from main() in unit test

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 Manager 进行网络调用。在 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) 的 return 值?在 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()
}