用mockwebserver来测试HTTP客户端

快速开始

首先定义pom文件,添加如下依赖:

	<dependencies>
		<!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-core -->
		<dependency>
			<groupId>io.github.openfeign</groupId>
			<artifactId>feign-core</artifactId>
			<version>11.0</version>
		</dependency>

		<dependency>
			<groupId>com.squareup.okhttp3</groupId>
			<artifactId>mockwebserver</artifactId>
			<version>4.6.0</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.assertj</groupId>
			<artifactId>assertj-core</artifactId>
			<version>3.14.0</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.5</version>
		</dependency>

	</dependencies>

接着就是编写单元测试,代码如下:

public class FeignTest {

	@Rule
	public final ExpectedException thrown = ExpectedException.none();
	@Rule
	public final MockWebServer server = new MockWebServer();

	@Test
	public void queryMap() throws Exception {
	    server.enqueue(new MockResponse().setBody("foo"));
	    TestInterface api = Feign.builder().target(TestInterface.class, "http://localhost:" + server.getPort());
	    api.queryMap(Maps.newHashMap("1", "apple"));
	    RecordedRequest request = server.takeRequest();
	    assertEquals(request.getPath(), "/?1=apple");
	}

        interface TestInterface { 
                @RequestLine("GET /")
		void queryMap(@QueryMap Map<String, Object> queryMap);
        }
}

上面的RecordedRequest还有很多方法来获得一个请求的各个部分,比如Headers、Body等等。

更多的功能

模拟长时间响应

    @Rule
    final MockWebServer server = new MockWebServer();

    server.enqueue(new MockResponse().setBody("foo").setBodyDelay(3, TimeUnit.SECONDS));

上面代码表示MockWebServer会在3秒后才返回响应体。

模拟连接失败

    @Rule
    final MockWebServer server = new MockWebServer();

    server .enqueue(new MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AT_START));

上面代码表示,连接成功后server端立马断开连接。

模拟302跳转

    @Rule
    final MockWebServer server1 = new MockWebServer();
    @Rule
    final MockWebServer server2 = new MockWebServer();

    String expectedLocation = server2.url("").url().toString();
    server1.enqueue(new MockResponse().setResponseCode(302).setHeader("Location", expectedLocation));
posted @ 2020-11-26 15:19  ralgo  阅读(321)  评论(0)    收藏  举报