Search code examples
androidretrofitmockwebserver

MockWebServer and Retrofit with Callback


I would like to simulate network communication by MockWebServer. Unfortulatelly retrofit callbacks are never invoking. My code:

    MockWebServer server = new MockWebServer();
    server.enqueue(new MockResponse().setResponseCode(200).setBody("{}"));
    server.play();

    RestAdapter restAdapter = new RestAdapter.Builder().setConverter(new MyGsonConverter(new Gson()))
            .setEndpoint(server.getUrl("/").toString()).build();

    restAdapter.create(SearchService.class).getCount(StringUtils.EMPTY,
            new Callback<CountContainer>() {

                @Override
                public void success(CountContainer countContainer, Response response) {
                    System.out.println("success");
                }

                @Override
                public void failure(RetrofitError error) {
                    System.out.println("error");
                }
            });

    server.shutdown();

When i use retrofit without callbacks it works.


Solution

  • By having a Callback you are telling Retrofit to invoke the request and call the callback asynchronously. This means that your test is exiting before anything happens.

    There are two ways to get this to work:

    • Use a lock at the end of the test and wait until one of the callback methods are invoked.
    • Pass an instance of a synchronous Executor (one that just calls .run() immediately) to setExecutors on the RestAdapter.Builder so that the background invocations and callback invocations happen synchronously.