package nucleus.example.main; import org.junit.Test; import org.mockito.ArgumentMatcher; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import javax.inject.Singleton; import dagger.Module; import dagger.ObjectGraph; import dagger.Provides; import nucleus.example.base.App; import nucleus.example.base.MainThread; import nucleus.example.base.ServerAPI; import rx.Observable; import rx.Scheduler; import rx.schedulers.TestScheduler; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class MainPresenterTest { private static final String TEST_TEXT = "test text"; public static final String FIRST_NAME = "Marilyn"; public static final String LAST_NAME = "Manson"; @Module(injects = MainPresenter.class) public class MainPresenterTestModule { @Singleton @Provides ServerAPI provideServerAPI() { return serverAPIMock; } @Singleton @Provides @MainThread Scheduler provideScheduler() { return testScheduler; } } ServerAPI serverAPIMock; TestScheduler testScheduler; @Test public void testRequest() throws Throwable { createServerApiMock(); createTestScheduler(); App.setObjectGraph(ObjectGraph.create(new MainPresenterTestModule())); MainPresenter presenter = new MainPresenter(); presenter.onCreate(null); presenter.request(FIRST_NAME + " " + LAST_NAME); MainActivity mainActivity = mock(MainActivity.class); presenter.takeView(mainActivity); testScheduler.triggerActions(); verify(serverAPIMock).getItems(FIRST_NAME, LAST_NAME); verify(mainActivity).onItems(argThat(new ArgumentMatcher<ServerAPI.Item[]>() { @Override public boolean matches(Object argument) { return ((ServerAPI.Item[])argument)[0].text.equals(TEST_TEXT); } }), anyString()); } private void createServerApiMock() { serverAPIMock = mock(ServerAPI.class); when(serverAPIMock.getItems(anyString(), anyString())).then(new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { ServerAPI.Response response = new ServerAPI.Response(); response.items = new ServerAPI.Item[]{new ServerAPI.Item(TEST_TEXT)}; return Observable.just(response); } }); } private void createTestScheduler() { testScheduler = new TestScheduler(); } }