Насмешливые вложенные вызовы api дооснащения с использованием MockWebServer

#java #retrofit2 #okhttp #junit5 #mockwebserver

Вопрос:

Я пишу тест junit, используя okhttp3.mockwebserver для модифицированного api rest 2.

Урезанный api выглядит следующим образом:

 public interface MyApi{  @POST("/api/get-orders")  retrofit2.Responselt;Setlt;Stringgt;gt; getOrders();   @POST("/api/cxl-order")  retrofit2.Responselt;Stringgt; cancelOrder(String ordeId); }  

Затем api вводится в другой класс, который делегирует вызовы таким образом:

 public class MyExchange{    private final MyApi api;    public MyExchange(MyApi api){  this.api = api;  }    public final Setlt;Stringgt; getOrders(){  Responselt;Setlt;Stringgt;gt; resp = api.getOrders();  //parse the response   Setlt;Stringgt; result = parse( resp );  return result;  }      public final boolean cancelOrder( String orderId ){  api.cancelOrder( orderId );    //Nested Call  Setlt;Stringgt; 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, а затем терпит неудачу из-за тайм-аута.

Есть какие-нибудь идеи о том, как издеваться над ответами на вложенные вызовы?

Ура!

Ответ №1:

В итоге я воспользовался Диспетчером, чтобы проверить путь запроса. Если путь заканчивается на «получить заказы», я отправляю насмешливый ответ для заказов, в противном случае для заказов на отмену.

 Dispatcher dispatcher = (request) -gt; {  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);