Contents

okhttp自带的mockserver教程

概述

本篇记录okhttp自带的mockserver这个库的使用方式.

作为一个网络库,okhttp自身也实现了一个mockserver,以方便写测试用例,这个库是独立的,也可以单独使用.

用作平时简单的mock数据,进行测试,很方便

使用方式

此处以Android为例,Java除了依赖方式有点差异,其他一致;

  1. 添加依赖
1
    androidTestImplementation('com.squareup.okhttp3:mockwebserver:3.13.1')
  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;
        }
    }

}

参考

  1. okhttp测试