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