JUnit单元测试4—模拟Web服务器

单元测试中很常见的需求是一个模拟的测试桩,例如数据库链接,HTTP服务等。业界已经有丰富的工具创建这样的测试桩。
本文以模拟一个Web服务器为例,介绍打桩测试。

软件准备

我们使用了开源的io.fabric8.mockwebserver组件,该组件是基于okhttp3及okhttp3中的mockwebserver实现的。
我们以Maven构建Java程序为例,只需要在pom.xml中添加依赖:


    
        io.fabric8
        mockwebserver
        0.1.2
        test
    

示例程序:
演示在运行单元测试时启动一个模拟的Web服务器,并支持返回指定内容。
实际使用时,可以根据mock server中接收的request进行判断,处理更复杂的服务端逻辑。

import static org.junit.Assert.*;

import java.io.IOException;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.mockwebserver.Dispatcher;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
import okhttp3.mockwebserver.RecordedRequest;

public class MockServerTest {
    private static MockWebServer server;

    @BeforeClass
    public static void initMockServer() throws IOException {
        server = new MockWebServer();
        final Dispatcher dispatcher = new Dispatcher() {
            @Override
            public MockResponse dispatch(RecordedRequest request) throws InterruptedException {
                return new MockResponse().setResponseCode(200).setBody("{\"id\":4234, \"domain\":\"itcore\"}");
            }
        };
        server.setDispatcher(dispatcher);
        server.start(32800);
    }

    @Test
    public void testGet() throws IOException {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(server.url("")).build();
        Response response = client.newCall(request).execute();
        String body = response.body().string();
        assertTrue(body.contains("4234"));
    }

    @AfterClass
    public static void closeMockWebServer() throws IOException {
        server.close();
    }
}

使用mvn test命令执行测试:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running MockServerTest
MockWebServer[32800] starting to accept connections
MockWebServer[32800] received request: GET / HTTP/1.1 and responded: HTTP/1.1 200 OK
{"id":4234, "domain":"itcore"}
MockWebServer[32800] done accepting connections: socket closed
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.797 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

支持HTTPS

如果需要让模拟的Web服务器对外提供HTTPS协议的服务,只需调用useHttps方法并添加相关引用即可。

server.useHttps(MockSSLContextFactory.create().getSocketFactory(), false);

注意:
如果在上述示例的MockServerTest测试类中调用useHttps协议,单元测试不会通过。
因为测试方法中发送消息的OkHttpClient工具类并没有设置信任服务端HTTPS证书。


上一篇:JUnit单元测试3—参数化测试
下一篇:JUnit单元测试5—PowerMock

你可能感兴趣的:(JUnit单元测试4—模拟Web服务器)