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

单元测试中很常见的需求是一个模拟的测试桩,例如数据库链接,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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • @Author:彭海波 前言 单元测试(又称为模块测试, Unit Testing)是针对程序模块(软件设计的最小...
    海波笔记阅读 5,023评论 0 52
  • 前言 单元测试是软件开发中必不可少的一环,但是在平常开发中往往因为项目周期紧,工作量大而被选择忽略,这样往往导致软...
    闻人的技术博客阅读 1,571评论 0 9
  • 1.Springboot的测试类库 SpringBoot 提供了许多实用工具和注解来帮助测试应用程序,主要包括以下...
    hadoop_a9bb阅读 13,831评论 0 9
  • Android单元测试介绍 处于高速迭代开发中的Android项目往往需要除黑盒测试外更加可靠的质量保障,这正是单...
    东经315度阅读 3,170评论 6 37
  • 知情辱母案是在几天前,本没有那么关注,但这几天越吵越凶,网上言论越讨论越多,连facebook上都见多篇文章和讨论...
    安迩東阅读 624评论 0 1