美文网首页
JUnit单元测试4—模拟Web服务器

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

作者: 莫问君心 | 来源:发表于2019-09-26 14:57 被阅读0次

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

    软件准备

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

    <dependencies>
        <dependency>
            <groupId>io.fabric8</groupId>
            <artifactId>mockwebserver</artifactId>
            <version>0.1.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    

    示例程序:
    演示在运行单元测试时启动一个模拟的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服务器

          本文链接:https://www.haomeiwen.com/subject/lenhyctx.html