how to test the server call with Mockito, Retrofit and RxJava
In this example you can learn how to test server call with Mockito and RxJava, We need this elements:
1. Service
2. RemoteDataSource
3. RemoteDataSourceTest
Simple Service:
public interface Service { String URL_BASE = "https://guessthebeach.herokuapp.com/api/"; @GET("topics/") Observable<List<Topics>> getTopicsRx(); }
For RemoteDataSource
public class RemoteDataSource implements Service { private Service api; public RemoteDataSource(Retrofit retrofit) { this.api = retrofit.create(Service.class); } @Override public Observable<List<Topics>> getTopicsRx() { return api.getTopicsRx(); } }
The key is MockWebServer from okhttp3.
This library makes it easy to test that your app Does The Right Thing when it makes HTTP and HTTPS calls. It lets you specify which responses to return and then verify that requests were made as expected.
Because it exercises your full HTTP stack, you can be confident that you’re testing everything. You can even copy & paste HTTP responses from your real web server to create representative test cases. Or test that your code survives in awkward-to-reproduce situations like 500 errors or slow-loading responses.
Use MockWebServer the same way that you use mocking frameworks like Mockito:
- Script the mocks.
- Run application code.
- Verify that the expected requests were made.
Here’s a complete example in RemoteDataSourceTest:
public class RemoteDataSourceTest { List<Topics> mResultList; MockWebServer mMockWebServer; TestSubscriber<List<Topics>> mSubscriber; @Before public void setUp() { Topics topics = new Topics(1, "Discern The Beach"); Topics topicsTwo = new Topics(2, "Discern The Football Player"); mResultList = new ArrayList(); mResultList.add(topics); mResultList.add(topicsTwo); mMockWebServer = new MockWebServer(); mSubscriber = new TestSubscriber<>(); } @Test public void serverCallWithError() { //Given String url = "dfdf/"; mMockWebServer.enqueue(new MockResponse().setBody(new Gson().toJson(mResultList))); Retrofit retrofit = new Retrofit.Builder() .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .baseUrl(mMockWebServer.url(url)) .build(); RemoteDataSource remoteDataSource = new RemoteDataSource(retrofit); //When remoteDataSource.getTopicsRx().subscribe(mSubscriber); //Then mSubscriber.assertNoErrors(); mSubscriber.assertCompleted(); } @Test public void severCallWithSuccessful() { //Given String url = "https://guessthebeach.herokuapp.com/api/"; mMockWebServer.enqueue(new MockResponse().setBody(new Gson().toJson(mResultList))); Retrofit retrofit = new Retrofit.Builder() .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .baseUrl(mMockWebServer.url(url)) .build(); RemoteDataSource remoteDataSource = new RemoteDataSource(retrofit); //When remoteDataSource.getTopicsRx().subscribe(mSubscriber); //Then mSubscriber.assertNoErrors(); mSubscriber.assertCompleted(); } }
You can check my example in GitHub