#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. Объявите это снаружи. Я отредактировал ответ, чтобы проиллюстрировать