Имитация функции, возвращающей значение, вызванное из main () в модульном тестировании

#go #mocking #aws-secrets-manager

#Вперед #издевательство #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 % vn", 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) ? В контексте Java я пытаюсь сделать что-то подобное, используя Mockito и when(functionIsCalled).thenReturn(mockValue) синтаксис.

Ответ №1:

Вы можете использовать функциональную переменную, чтобы присвоить ей какое-либо другое значение для тестирования:

 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()
}
  

Комментарии:

1. Добавление getSecret=func(secretName string) (Credentials,error) { return nil,nil } дает мне undefined: getSecret

2. Вы объявили getSecret переменную? Является ли ваш тест main пакетом?

3. Вы объявили getSecret в main. Объявите это снаружи. Я отредактировал ответ, чтобы проиллюстрировать