现在稍有点规模的服务已经很少由一个单独的程序完成所有功能,一般会按照功能模块拆分成多个服务,服务也可能会依赖其它第三方提供的服务。在工作进行程序开发时,若依赖的接口上游的服务没有开发完成时,为了不影响开发进度和功能测试,这时候就需要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服务。