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.Rule; import org.junit.Test; import org.junit.runner.RunWith; import rx.functions.Action1; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.Espresso.registerIdlingResources; 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 SecondActivityEspressoTest { @Rule public final ActivityRule<SecondActivity> secondActivity = new ActivityRule<>(SecondActivity.class); @Test public void secondActivityTest() throws InterruptedException { DecoratedLongRunningService decoratedLongRunningService = new DecoratedLongRunningService(); registerIdlingResources(decoratedLongRunningService); secondActivity.get().setService(decoratedLongRunningService); onView(withId(R.id.button1OnSecondActivity)).perform(click()); onView(withText("SUCCESS")).check(ViewAssertions.matches(isDisplayed())); } private static class DecoratedLongRunningService extends RealLongRunningService implements IdlingResource { private ResourceCallback resourceCallback; private volatile boolean isRunning; @Override public void doLongRunningOpAndReturnResult(Action1<String> action) { isRunning = true; super.doLongRunningOpAndReturnResult(new Action1<String>() { @Override public void call(String realResult) { action.call(realResult); isRunning = false; resourceCallback.onTransitionToIdle(); } }); } @Override public String getName() { return "Long Running Service"; } @Override public boolean isIdleNow() { return !isRunning; } @Override public void registerIdleTransitionCallback(ResourceCallback resourceCallback) { this.resourceCallback = resourceCallback; } } }