package com.patryklenza.androidespressoidlingresource; import android.support.test.espresso.IdlingResource; import android.support.test.espresso.assertion.ViewAssertions; import android.support.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.Espresso.registerIdlingResources; import static android.support.test.espresso.Espresso.unregisterIdlingResources; import static android.support.test.espresso.action.ViewActions.click; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withText; @RunWith(AndroidJUnit4.class) public class FirstActivityEspressoTest { @Rule public final ActivityRule<FirstActivity> firstActivity = new ActivityRule<>(FirstActivity.class); private SecondActivityCreatedIdlingResource secondActivityCreatedIdlingResource; @After public void tearDown() { unregisterIdlingResources(secondActivityCreatedIdlingResource); secondActivityCreatedIdlingResource.unsubscribe(); } @Test public void firstActivityTest() throws InterruptedException { secondActivityCreatedIdlingResource = new SecondActivityCreatedIdlingResource(); GlobalApplication.activityEventStream(). subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(secondActivityCreatedIdlingResource); // Click on button that simulates long network call and after success goes to SecondActivity onView(withId(R.id.button1OnFirstActivity)).perform(click()); // Wait until SecondActivity is created registerIdlingResources(secondActivityCreatedIdlingResource); // Validate label on SecondActivity onView(withText("Second Activity")).check(ViewAssertions.matches(isDisplayed())); } private static class SecondActivityCreatedIdlingResource extends Subscriber<ActivityEvent> implements IdlingResource { private volatile ResourceCallback resourceCallback; private volatile boolean secondActivityCreated; @Override public String getName() { return "SecondActivity Created"; } @Override public boolean isIdleNow() { return secondActivityCreated; } @Override public void registerIdleTransitionCallback(ResourceCallback resourceCallback) { this.resourceCallback = resourceCallback; } @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(ActivityEvent activityEvent) { if(secondActivityCreated(activityEvent)) { secondActivityCreated = true; resourceCallback.onTransitionToIdle(); } } private boolean secondActivityCreated(ActivityEvent activityEvent) { return activityEvent.getActivityClass().equals(SecondActivity.class) && activityEvent.getEventKind() == ActivityEventKind.CREATED; } } }