Наткнулся на очень интересную библиотеку, позволяющую переопределять функции и методы у объектов для написания юнит тестов перед компиляцией. В PHP, Ruby или Python это делается довольно просто парой строк. Т.к го все же язык компилируемый и со строгой типизацией тут нужно повозиться.
Итак, устанавливаем эту библиотеку:
github.com/bouk/monkey
Пишем наш тест и «мокаем» метод http.get:
func TestHttpGet(t *testing.T) { // patching http.Get method var guard *monkey.PatchGuard guard = monkey.PatchInstanceMethod(reflect.TypeOf(http.DefaultClient), "Get", func(c *http.Client, url string) (*http.Response, error) { guard.Unpatch() defer guard.Restore() if url != "https://example.com" { return nil, fmt.Errorf("wrong url") } return &http.Response{Status: "200"}, nil }) response, _ := http.Get("https://example.com") assert.Equal(t, "200", response.Status) _, err := http.Get("https://another-example.com") assert.Error(t, err) }
Запускаем и убеждаемся что да, наш метод из пакета http.get был заменен на нашу функцию. Тем самым появляется возможность писать более понятные и простые юнит тесты, вызывающие сторонние пакеты.