使用 MockWebServer 模拟嵌套改造 api 调用
Mocking nested retrofit api calls using MockWebServer
我正在使用 okhttp3.mockwebserver 编写一个 junit 测试以进行 retrofit2 rest api。
修剪后的 api 看起来像这样:
public interface MyApi{
@POST("/api/get-orders")
retrofit2.Response<Set<String>> getOrders();
@POST("/api/cxl-order")
retrofit2.Response<String> cancelOrder(String ordeId);
}
然后 api 被注入到另一个 class,后者这样委托调用:
public class MyExchange{
private final MyApi api;
public MyExchange(MyApi api){
this.api = api;
}
public final Set<String> getOrders(){
Response<Set<String>> resp = api.getOrders();
//parse the response
Set<String> result = parse( resp );
return result;
}
public final boolean cancelOrder( String orderId ){
api.cancelOrder( orderId );
//Nested Call
Set<String> orders = getOrders();
return !orders.contains(orderId);
}
}
我在测试中执行以下操作:
@Test
public void cancel_order(){
MockWebServer server = new MockWebServer();
server.start();
String orderId ="OrderId_123";
MyApi mockApi = new Retrofit.Builder().baseUrl("/").build().create(MyApi.class);
MyExchange exchange = new MyExchange(mockApi);
server.enqueue( new MockResponse().setResponseCode(HttpURLConnection.HTTP_OK, orderId));
server.enqueue( new MockResponse().setResponseCode(HttpURLConnection.HTTP_OK, Set.of()));
exchange.cancelOrder(orderId);
}
因为 cancelOrder() 的实现调用 api.cancelOrder() 然后 api.getOrders(),我添加了两个对应于每个的模拟响应。但是,看起来只返回第一个模拟响应。对于第二个 (getOrders),模拟服务器实际上尝试通过 REST 连接,然后因超时而失败。
关于如何模拟嵌套调用的响应有什么想法吗?
干杯!
我最终使用 Dispatcher 检查请求的路径。
如果路径以“get-orders”结尾,我会为订单发送模拟响应,否则为取消订单。
Dispatcher dispatcher = (request) -> {
if( request.getPath().endsWith("get-orders"){
return mock response for orders
}else if( request.getPath().endsWith("cxl-orders"){
return mock response for cancel orders
}
}
mockServer.setDispatcher(dispatcher);
我正在使用 okhttp3.mockwebserver 编写一个 junit 测试以进行 retrofit2 rest api。
修剪后的 api 看起来像这样:
public interface MyApi{
@POST("/api/get-orders")
retrofit2.Response<Set<String>> getOrders();
@POST("/api/cxl-order")
retrofit2.Response<String> cancelOrder(String ordeId);
}
然后 api 被注入到另一个 class,后者这样委托调用:
public class MyExchange{
private final MyApi api;
public MyExchange(MyApi api){
this.api = api;
}
public final Set<String> getOrders(){
Response<Set<String>> resp = api.getOrders();
//parse the response
Set<String> result = parse( resp );
return result;
}
public final boolean cancelOrder( String orderId ){
api.cancelOrder( orderId );
//Nested Call
Set<String> orders = getOrders();
return !orders.contains(orderId);
}
}
我在测试中执行以下操作:
@Test
public void cancel_order(){
MockWebServer server = new MockWebServer();
server.start();
String orderId ="OrderId_123";
MyApi mockApi = new Retrofit.Builder().baseUrl("/").build().create(MyApi.class);
MyExchange exchange = new MyExchange(mockApi);
server.enqueue( new MockResponse().setResponseCode(HttpURLConnection.HTTP_OK, orderId));
server.enqueue( new MockResponse().setResponseCode(HttpURLConnection.HTTP_OK, Set.of()));
exchange.cancelOrder(orderId);
}
因为 cancelOrder() 的实现调用 api.cancelOrder() 然后 api.getOrders(),我添加了两个对应于每个的模拟响应。但是,看起来只返回第一个模拟响应。对于第二个 (getOrders),模拟服务器实际上尝试通过 REST 连接,然后因超时而失败。
关于如何模拟嵌套调用的响应有什么想法吗?
干杯!
我最终使用 Dispatcher 检查请求的路径。 如果路径以“get-orders”结尾,我会为订单发送模拟响应,否则为取消订单。
Dispatcher dispatcher = (request) -> {
if( request.getPath().endsWith("get-orders"){
return mock response for orders
}else if( request.getPath().endsWith("cxl-orders"){
return mock response for cancel orders
}
}
mockServer.setDispatcher(dispatcher);