package com.sqisland.espresso.battery; import android.app.Instrumentation; import android.content.Context; import android.support.annotation.ColorRes; import android.support.test.InstrumentationRegistry; import android.support.test.rule.ActivityTestRule; import android.support.v4.content.ContextCompat; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.Mockito; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.action.ViewActions.click; import static android.support.test.espresso.assertion.ViewAssertions.matches; import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withText; import static com.sqisland.espresso.battery.CustomViewMatchers.withTextColor; import static org.mockito.Mockito.times; public class MainActivityTest { @Rule public ActivityTestRule<MainActivity> activityRule = new ActivityTestRule<>( MainActivity.class, true, // initialTouchMode false); // launchActivity. False so we can set up mocks per test method private BatteryReader batteryReader; @Before public void setUp() throws Exception { Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); MockDemoApplication app = (MockDemoApplication) instrumentation.getTargetContext().getApplicationContext(); Injection injection = app.getInjection(); batteryReader = injection.provideBatteryReader(); Mockito.reset(batteryReader); } @Test public void half() { Mockito.when(batteryReader.getBatteryPercent()).thenReturn(50f); activityRule.launchActivity(null); verifyTextAndColor("50%", R.color.battery_ok); Mockito.verify(batteryReader, times(1)).getBatteryPercent(); } @Test public void low() { Mockito.when(batteryReader.getBatteryPercent()).thenReturn(15f); activityRule.launchActivity(null); verifyTextAndColor("15%", R.color.battery_low); Mockito.verify(batteryReader, times(1)).getBatteryPercent(); } @Test public void dropping() { Mockito.when(batteryReader.getBatteryPercent()) .thenReturn(20f) .thenReturn(10f); activityRule.launchActivity(null); verifyTextAndColor("20%", R.color.battery_ok); onView(withId(R.id.battery)) .perform(click()); verifyTextAndColor("10%", R.color.battery_low); Mockito.verify(batteryReader, times(2)).getBatteryPercent(); } private void verifyTextAndColor(String text, @ColorRes int colorId) { Context context = InstrumentationRegistry.getTargetContext(); int expectedColor = ContextCompat.getColor(context, colorId); onView(withId(R.id.battery)) .check(matches(withText(text))) .check(matches(withTextColor(expectedColor))); } }