单元测试,为retrofit2请求定制Call类:response具有私有访问



当我创建自定义Call类时,我不能返回Response,因为Response类是final的。有什么解决办法吗?

public class TestCall implements Call<PlacesResults> {
    String fileType;
    String getPlacesJson = "getplaces.json";
    String getPlacesUpdatedJson = "getplaces_updated.json";
    public TestCall(String fileType) {
        this.fileType = fileType;
    }
    @Override
    public Response execute() throws IOException {
        String responseString;
        InputStream is;
        if (fileType.equals(getPlacesJson)) {
            is = InstrumentationRegistry.getContext().getAssets().open(getPlacesJson);
        } else {
            is = InstrumentationRegistry.getContext().getAssets().open(getPlacesUpdatedJson);
        }
        PlacesResults placesResults= new Gson().fromJson(new InputStreamReader(is), PlacesResults.class);
        //CAN"T DO IT
        return new Response<PlacesResults>(null, placesResults, null);
    }
    @Override
    public void enqueue(Callback callback) {
    }
//default methods here
//....
}
在我的单元测试类中,我想这样使用它:
Mockito.when(mockApi.getNearbyPlaces(eq("testkey"), Matchers.anyString(), Matchers.anyInt())).thenReturn(new TestCall("getplaces.json"));
GetPlacesAction action = new GetPlacesAction(getContext().getContentResolver(), mockEventBus, mockApi, "testkey");
action.downloadPlaces();

我的downloadPlaces()方法如下:

public void downloadPlaces() {
    Call<PlacesResults> call = api.getNearbyPlaces(webApiKey, LocationLocator.getInstance().getLastLocation(), 500);
    PlacesResults jsonResponse = null;
    try {
        Response<PlacesResults> response = call.execute();
        Timber.d("response " + response);
        jsonResponse = response.body();
        if (jsonResponse == null) {
            throw new IllegalStateException("Response is null");
        }
    } catch (UnknownHostException e) {
        events.sendError(EventBus.ERROR_NO_CONNECTION);
    } catch (Exception e) {
        events.sendError(EventBus.ERROR_NO_PLACES);
        return;
    }
    //TODO: some database operations
}

在更彻底地查看retrofit2 Response类之后,我发现有一个静态方法可以完成我所需要的。因此,我简单地修改了这一行:

return new Response<PlacesResults>(null, placesResults, null);

:

return Response.success(placesResults);

一切正常

相关内容

  • 没有找到相关文章

最新更新