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