【发布时间】:2022-01-03 07:30:37
【问题描述】:
我正在使用 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 注入到另一个类,从而委托调用:
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 连接,然后因超时而失败。
关于如何模拟嵌套调用的响应有什么想法吗?
干杯!
【问题讨论】:
标签: java retrofit2 okhttp junit5 mockwebserver