概述
本篇记录okhttp自带的mockserver这个库的使用方式.
作为一个网络库,okhttp自身也实现了一个mockserver,以方便写测试用例,这个库是独立的,也可以单独使用.
用作平时简单的mock数据,进行测试,很方便
使用方式
此处以Android为例,Java除了依赖方式有点差异,其他一致;
- 添加依赖
| 1
 |     androidTestImplementation('com.squareup.okhttp3:mockwebserver:3.13.1')
 | 
 
- 代码使用
|  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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 |     public class MockRes {
    public final MockWebServer server = new MockWebServer();
    public OkHttpClient client = new OkHttpClient();
    @Test
    public void simpleTest() {
        // 构造一个mock的 response
        MockResponse mockResponse = new MockResponse().setBody("abc");
        // 添加到 server 中,server中将会按照FIFO的方式进行返回
        // enqueue 一个,下次请求就返回队列中最靠前的,是同步的
        server.enqueue(mockResponse);
        // 同步发起请求,虽然此处添加了path,实则在不自定义dispatcher的请求下,是不会影响前一步mockresponse的返回的
        Response executeRes = executeSynchronously("/a");
        // 消费mock的结果
        assertNotNull(executeRes);
        try {
            assertEquals("abc", executeRes.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void customDispatch() {
        // 采用自定义 dispatcher 之后,就不能再 调用 server.enqueue(mockResponse) 方法,所有的mock行为均定义在 Dispatcher 类中
        server.setDispatcher(new Dispatcher() {
            @Override
            public MockResponse dispatch(RecordedRequest request) throws InterruptedException {
                if ("/a".equals(request.getPath())) {
                    return new MockResponse().setBody("A");
                }
                return new MockResponse().setBody("O");
            }
        });
        // 同步发起请求,path 为 /a 怎么应该返回body 是 A
        Response executeRes = executeSynchronously("/a");
        // 消费mock的结果
        assertNotNull(executeRes);
        try {
            assertEquals("A", executeRes.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 同步发起请求,path 为 /b 怎么应该返回body 是 O
        Response bRes = executeSynchronously("/b");
        // 消费mock的结果
        assertNotNull(bRes);
        try {
            assertEquals("O", bRes.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private Response executeSynchronously(String path, String... headers) {
        Request.Builder builder = new Request.Builder();
        builder.url(server.url(path));
        for (int i = 0, size = headers.length; i < size; i += 2) {
            builder.addHeader(headers[i], headers[i + 1]);
        }
        Call call = client.newCall(builder.build());
        try {
            return call.execute();
        } catch (IOException e) {
            return null;
        }
    }
}
 | 
 
参考
- okhttp测试