Created
November 6, 2018 12:57
-
-
Save hilfritz/404ce63573e9263c681afc038ecbb8bf to your computer and use it in GitHub Desktop.
Android unit test: Mockito, Retrofit, Robolectric
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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