Golang使用httptest对HTTP服务进行Mock

Golang uses httptest to Mock HTTP services

Posted by alovn on March 4, 2022

现在稍有点规模的服务已经很少由一个单独的程序完成所有功能,一般会按照功能模块拆分成多个服务,服务也可能会依赖其它第三方提供的服务。在工作进行程序开发时,若依赖的接口上游的服务没有开发完成时,为了不影响开发进度和功能测试,这时候就需要Mock上游的Web API接口。Golang中提供的httptest包同样可以进行Mock HTTP服务。

示例

直接看代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import (
    "io"
    "net/http"
    "net/http/httptest"
)

func TestMock(t *testing.T) {
    //Mock
    server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        _, _ = w.Write([]byte("OK"))
    }))
    defer server.Close()
    t.Logf("URL: %s", server.URL) //得到Mock的URL
    
    //对Mock URL发起请求
    req, _ := http.NewRequest(http.MethodGet, server.URL, nil)
    client := &http.Client{}
    res, err := client.Do(req)
    if res.Body != nil {
        defer res.Body.Close()
    }
    if err != nil {
        t.Errorf("error: %v", err)
        return
    }
    //获取Mock服务的返回结果
    bs, err := io.ReadAll(res.Body)
    if err != nil {
        t.Errorf("error: %v", err)
        return
    }
    s := string(bs)
    if s != "OK" {
        t.Errorf("error:%s != OK", s)
    }
}

上面代码中直接通过htttest.NewServer可以创建一个用于测试的http server,它的定义如下:

1
2
3
// NewServer starts and returns a new Server.
// The caller should call Close when finished, to shut it down.
func NewServer(handler http.Handler) *Server

然后通过得到 server.URL 可以得到Mock的URL地址,然后通过这个URL直接发起HTTP请求。

这里只是一个简单的示例,在实际工作中还要根据具体需求设置其它参数并进行Mock服务。