Golang 다목적 HTTP mocking gock 라이브러리 알아보기

오늘은 Golang으로 다목적의 HTTP를 mocking할 수 있는 gock 라이브러리를 알아보려 합니다.

gock 설치

우선 Golang의 환경을 구성하기 위해 https://golang.org/dl/ 에서 윈도우, 리눅스, 맥에서 설치 프로그램을 내려받을 수 있습니다.

맥에서 brew로 쉽게 설치할 수 있습니다.

brew install go

우분투에서도 apt로 쉽게 설치할 수 있습니다.

sudo apt-get install golang-go

맥에서 Golang의 버전을 올리려면 brew를 이용합니다.

brew upgrade go

우분투에서도 Golang의 버전을 올리려면 backports 저장소를 등록하고 apt를 이용합니다.

sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt-get update
sudo apt-get install golang-go

go get으로 gock 패키지를 설치합니다.

go get -u gopkg.in/h2non/gock.v1

홈의 go 폴더에 gock 소스코드와 패키지 파일이 생성됩니다.

예제

package test

해당 소스코드를 실행 파일로 인식하게 해주도록 main이라고 선언하지 않고 테스트를 위해 다른 이름을 적습니다.

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"testing"

	"gopkg.in/h2non/gock.v1"
)

fmt, ioutil, http, testing 그리고 gock을 가져옵니다.

func TestFunc(t *testing.T) {
	defer gock.Off()

테스트 함수를 만든 다음 defer 키워드로 기본 HTTP 인터셉터를 비활성화하고, 모든 mock을 제거합니다.

	gock.New("http://example.com").
		Get("/test").
		Reply(200).
		JSON(map[string]string{"hello": "world"})

Get 요청 보낼 HTTP mock을 만듭니다.

http://example.com/test 에서 상태 코드 200과 {“hello”: “world”} 문자열을 반환합니다.

	res, _ := http.Get("http://example.com/test")
	fmt.Println(res.StatusCode)

	body, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(body))

실제 코드처럼 요청을 보내면 Status 코드와 본문이 반환됩니다.

	fmt.Println(gock.IsDone())
}

mock이 성공적으로 수행되었다면 참으로 출력됩니다.

Written on October 24, 2019