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