Simulate no network using Retrofit and MockWebServer

Dori picture Dori · Jul 25, 2014 · Viewed 15.8k times · Source

I want to simulate the no network case when using RetroFit and MockWebServer.

Im currently testing using Espresso and supplying the MockWebServers url to the RestAdapter before I start my tests. This works great for mocking server responses and so on but I cant see a simple way to script the java.net.ConnectException exception thrown when a device has no network. I can see the MockResponse allows throttling simulation and so on but not a custom exception.

I know I could go the root of mocking the actual web api interface used by retrofit but I would like to use the same approach as my other tests if possible by using MockWebServer.

I imagine I've just missed something simple :)

Thanks

Answer

Jake Wharton picture Jake Wharton · Jul 25, 2014

Retrofit has a retrofit-mock module which offers a MockRestAdapter class whose purpose is to simulate network delay and errors.

This is a used in conjunction with the normal RestAdapter to create an instance of your service. You can see a full example in the samples/mock-github-client/ folder of the repo: https://github.com/square/retrofit/tree/parent-1.9.0/retrofit-samples/mock-github-client

MockRestAdapter offers these APIs:

  • setDelay - Set the network round trip delay, in milliseconds.
  • setVariancePercentage - Set the plus-or-minus variance percentage of the network round trip delay.
  • setErrorPercentage - Set the percentage of calls to calculateIsFailure() that return true.

In your test, you can call setErrorPercentage(100) to guarantee that a network error will occur. By default the amount of time for the error to be thrown is anywhere from 0 to 3x the delay. Set the delay to 0 for instant results.