用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));

浙公网安备 33010602011771号