快速开始
首先定义pom文件,添加如下依赖:
io.github.openfeign
feign-core
11.0
com.squareup.okhttp3
mockwebserver
4.6.0
test
junit
junit
4.11
test
org.assertj
assertj-core
3.14.0
test
com.google.code.gson
gson
2.5
接着就是编写单元测试,代码如下:
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 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));