Skip to content

Instantly share code, notes, and snippets.

@hilfritz
Created November 6, 2018 12:57
Show Gist options
  • Save hilfritz/404ce63573e9263c681afc038ecbb8bf to your computer and use it in GitHub Desktop.
Save hilfritz/404ce63573e9263c681afc038ecbb8bf to your computer and use it in GitHub Desktop.
Android unit test: Mockito, Retrofit, Robolectric
//MODEL CLASS
interface Model{
void init(Gson gson);
public Single<List<ImgAlbum>> getPhotos();
}
/**
* @author Hilfritz Camallere on 6/11/18
*/
@RunWith(RobolectricTestRunner.class)
@Config(manifest= Config.NONE)
public class MainPresenterUnitTest {
//NEED THIS TO MAKE SURE THE TEST IS DONE IN ONE SAME THREAD
ThreadHandler threadHandler = new ThreadHandler() {
@Override
public Scheduler iOThread() {
return Schedulers.trampoline();
}
@Override
public Scheduler mainThread() {
return Schedulers.trampoline();
}
};
//USEFUL IF YOU HAVE DELAYS() IN SOME OBSERVABLES
TestScheduler testScheduler = new TestScheduler();
MainPresenter mainPresenter;
@Mock
MainPresenter.MainView mainView;
@Mock
MainPresenter.Model model;
@Before
public void setup(){
RxJavaPlugins.reset();
mainPresenter = new MainPresenterImpl();
model = Mockito.mock(MainPresenter.Model.class);
mainView = Mockito.mock(MainPresenter.MainView.class);
LIST.add(new ImgAlbum("title", "description", 0));
LIST.add(new ImgAlbum("title2", "description2", 1));
LIST.add(new ImgAlbum("title3", "description3", 2));
}
@After
public void destroy(){
RxJavaPlugins.reset();
mainPresenter = null;
model = null;
mainView = null;
}
/**
* IMPORTANT: THIS MUST BE CALLED BEFORE YOU START EXECUTING OBSERVABLES WITH DELAYS
*/
private void setComputationSchedulerHandler() {
RxJavaPlugins.setComputationSchedulerHandler(new Function<Scheduler, Scheduler>() {
@Override
public Scheduler apply(Scheduler scheduler) throws Exception {
return testScheduler;
}
});
}
@Test
public void successRefreshListEmptyTest(){
setComputationSchedulerHandler();
Mockito.when(model.getPhotos()).thenReturn(Single.just(EMPTY_LIST));
mainPresenter.init(mainView, model, threadHandler);
mainPresenter.refresh(); //NOTE: #REFRESH() IMPLEMENTATION HAS 800MS DELAY
testScheduler.advanceTimeBy(800, TimeUnit.MILLISECONDS); //IMPORTANT: 800MS DELAY IN REFRESH IS REFLECTED HERE
Mockito.verify(mainView, Mockito.times(2)).showPDialog();
Mockito.verify(mainView, Mockito.atLeastOnce()).stopScroll();
Mockito.verify(mainView, Mockito.never()).notifyListData();
Mockito.verify(mainView, Mockito.times(1)).showDataNotAvailableDialog();
Mockito.verify(mainView, Mockito.never()).showNoInternetError();
Mockito.verify(mainView, Mockito.never()).showSomethingWentWrong();
Mockito.verify(mainView, Mockito.atLeastOnce()).hidePDialog();
}
@Test
public void errorLoadListNoInternetTest(){
final IOException exception = new IOException("noInternet");
Mockito.when(model.getPhotos()).thenReturn(Single.error(exception)); //IMPORTANT: SIMULATES THE EXCEPTION FOR NO INTERNET CONNECTION
//allows the subscriber's onError() method to be called
mainPresenter.init(mainView, model, threadHandler);
mainPresenter.run();
Mockito.verify(mainView, Mockito.atLeastOnce()).showPDialog();
Mockito.verify(mainView, Mockito.never()).notifyListData();
Mockito.verify(mainView, Mockito.never()).showDataNotAvailableDialog();
Mockito.verify(mainView, Mockito.never()).showSomethingWentWrong();
Mockito.verify(mainView, Mockito.atLeastOnce()).hidePDialog();
Mockito.verify(mainView, Mockito.times(1)).showNoInternetError();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment