From ce32505ca3746a225632dfacc56bf4bebe924fce Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Wed, 29 Nov 2017 21:29:09 -0600 Subject: [PATCH] Created a Robolectric unit test replacement for the NearbyActivity test. --- app/build.gradle | 1 + .../free/nrw/commons/NearbyActivityTest.java | 30 ---------- .../free/nrw/commons/CommonsApplication.java | 3 +- .../nrw/commons/nearby/NearbyActivity.java | 4 +- .../java/fr/free/nrw/commons/MediaTest.java | 2 +- .../nrw/commons/NearbyControllerTest.java | 2 +- .../fr/free/nrw/commons/PageTitleTest.java | 2 +- .../nrw/commons/TestCommonsApplication.java | 30 +++++++++- .../ApacheHttpClientMediaWikiApiTest.java | 3 +- .../commons/nearby/NearbyActivityTest.java | 59 +++++++++++++++++++ .../nearby/NearbyAdapterFactoryTest.java | 3 +- 11 files changed, 100 insertions(+), 39 deletions(-) delete mode 100644 app/src/androidTest/java/fr/free/nrw/commons/NearbyActivityTest.java create mode 100644 app/src/test/java/fr/free/nrw/commons/nearby/NearbyActivityTest.java diff --git a/app/build.gradle b/app/build.gradle index 7a9ed6ba7..1076f3e46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -58,6 +58,7 @@ dependencies { testImplementation 'junit:junit:4.12' testImplementation 'org.robolectric:robolectric:3.4' + testImplementation 'org.mockito:mockito-all:1.10.19' testImplementation 'com.squareup.okhttp3:mockwebserver:3.8.1' androidTestImplementation 'com.squareup.okhttp3:mockwebserver:3.8.1' diff --git a/app/src/androidTest/java/fr/free/nrw/commons/NearbyActivityTest.java b/app/src/androidTest/java/fr/free/nrw/commons/NearbyActivityTest.java deleted file mode 100644 index f9ec72569..000000000 --- a/app/src/androidTest/java/fr/free/nrw/commons/NearbyActivityTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package fr.free.nrw.commons; - -import android.support.test.espresso.assertion.ViewAssertions; -import android.support.test.filters.LargeTest; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import fr.free.nrw.commons.nearby.NearbyActivity; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; -import static android.support.test.espresso.matcher.ViewMatchers.withText; - -@LargeTest -@RunWith(AndroidJUnit4.class) -public class NearbyActivityTest { - @Rule - public final ActivityTestRule nearby = - new ActivityTestRule<>(NearbyActivity.class); - - @Test - public void testActivityLaunch() { - onView(withText(R.string.title_activity_nearby)) - .check(ViewAssertions.matches(isDisplayed())); - } -} diff --git a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java index fcb1fa2d2..30cad5432 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -29,6 +29,7 @@ import java.io.IOException; import javax.inject.Inject; +import dagger.android.AndroidInjector; import dagger.android.DispatchingAndroidInjector; import dagger.android.HasActivityInjector; import fr.free.nrw.commons.auth.AccountUtil; @@ -272,7 +273,7 @@ public class CommonsApplication extends Application implements HasActivityInject } @Override - public DispatchingAndroidInjector activityInjector() { + public AndroidInjector activityInjector() { return dispatchingActivityInjector; } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java index 3e44eab4b..578b5e91e 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java @@ -338,7 +338,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); Fragment fragment = new NearbyMapFragment(); fragment.setArguments(bundle); - fragmentTransaction.replace(R.id.container, fragment); + fragmentTransaction.replace(R.id.container, fragment, fragment.getClass().getSimpleName()); fragmentTransaction.commitAllowingStateLoss(); } @@ -349,7 +349,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); Fragment fragment = new NearbyListFragment(); fragment.setArguments(bundle); - fragmentTransaction.replace(R.id.container, fragment); + fragmentTransaction.replace(R.id.container, fragment, fragment.getClass().getSimpleName()); fragmentTransaction.commitAllowingStateLoss(); } diff --git a/app/src/test/java/fr/free/nrw/commons/MediaTest.java b/app/src/test/java/fr/free/nrw/commons/MediaTest.java index 21cfc2c34..4f53351ad 100644 --- a/app/src/test/java/fr/free/nrw/commons/MediaTest.java +++ b/app/src/test/java/fr/free/nrw/commons/MediaTest.java @@ -9,7 +9,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 21) +@Config(constants = BuildConfig.class, sdk = 21, application = TestCommonsApplication.class) public class MediaTest { @Test public void displayTitleShouldStripExtension() { diff --git a/app/src/test/java/fr/free/nrw/commons/NearbyControllerTest.java b/app/src/test/java/fr/free/nrw/commons/NearbyControllerTest.java index 6ae2063da..752b7404d 100644 --- a/app/src/test/java/fr/free/nrw/commons/NearbyControllerTest.java +++ b/app/src/test/java/fr/free/nrw/commons/NearbyControllerTest.java @@ -18,7 +18,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 21) +@Config(constants = BuildConfig.class, sdk = 21, application = TestCommonsApplication.class) public class NearbyControllerTest { @Test diff --git a/app/src/test/java/fr/free/nrw/commons/PageTitleTest.java b/app/src/test/java/fr/free/nrw/commons/PageTitleTest.java index 455b3fbd0..16336b1b0 100644 --- a/app/src/test/java/fr/free/nrw/commons/PageTitleTest.java +++ b/app/src/test/java/fr/free/nrw/commons/PageTitleTest.java @@ -11,7 +11,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 21) +@Config(constants = BuildConfig.class, sdk = 21, application = TestCommonsApplication.class) public class PageTitleTest { @Test public void displayTextShouldNotBeUnderscored() { diff --git a/app/src/test/java/fr/free/nrw/commons/TestCommonsApplication.java b/app/src/test/java/fr/free/nrw/commons/TestCommonsApplication.java index af4d50a91..f9bad405a 100644 --- a/app/src/test/java/fr/free/nrw/commons/TestCommonsApplication.java +++ b/app/src/test/java/fr/free/nrw/commons/TestCommonsApplication.java @@ -1,12 +1,40 @@ package fr.free.nrw.commons; +import android.app.Activity; + import com.squareup.leakcanary.RefWatcher; -// This class is automatically discovered by Robolectric +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import dagger.android.AndroidInjector; +import fr.free.nrw.commons.nearby.NearbyPlaces; + public class TestCommonsApplication extends CommonsApplication { + @Mock + private AndroidInjector mockInjector; + @Mock + private NearbyPlaces mockNearbyPlaces; + + @Override + public void onCreate() { + super.onCreate(); + MockitoAnnotations.initMocks(this); + } + @Override protected RefWatcher setupLeakCanary() { // No leakcanary in unit tests. return RefWatcher.DISABLED; } + + @Override + public AndroidInjector activityInjector() { + return mockInjector; + } + + @Override + public synchronized NearbyPlaces getNearbyPlaces() { + return mockNearbyPlaces; + } } diff --git a/app/src/test/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApiTest.java b/app/src/test/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApiTest.java index e27ca19ea..8e72b3252 100644 --- a/app/src/test/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApiTest.java +++ b/app/src/test/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApiTest.java @@ -17,6 +17,7 @@ import java.util.Map; import java.util.Set; import fr.free.nrw.commons.BuildConfig; +import fr.free.nrw.commons.TestCommonsApplication; import io.reactivex.observers.TestObserver; import okhttp3.HttpUrl; import okhttp3.mockwebserver.MockResponse; @@ -28,7 +29,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 21) +@Config(constants = BuildConfig.class, sdk = 21, application = TestCommonsApplication.class) public class ApacheHttpClientMediaWikiApiTest { private ApacheHttpClientMediaWikiApi testObject; diff --git a/app/src/test/java/fr/free/nrw/commons/nearby/NearbyActivityTest.java b/app/src/test/java/fr/free/nrw/commons/nearby/NearbyActivityTest.java new file mode 100644 index 000000000..c223203b0 --- /dev/null +++ b/app/src/test/java/fr/free/nrw/commons/nearby/NearbyActivityTest.java @@ -0,0 +1,59 @@ +package fr.free.nrw.commons.nearby; + +import android.app.Activity; +import android.support.v4.app.Fragment; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.android.controller.ActivityController; +import org.robolectric.annotation.Config; + +import dagger.android.AndroidInjector; +import fr.free.nrw.commons.BuildConfig; +import fr.free.nrw.commons.TestCommonsApplication; +import fr.free.nrw.commons.location.LatLng; +import fr.free.nrw.commons.location.LocationServiceManager; + +import static junit.framework.Assert.assertNotNull; +import static org.mockito.Matchers.isA; +import static org.mockito.Mockito.when; + +@RunWith(RobolectricTestRunner.class) +@Config(constants = BuildConfig.class, sdk = 21, application = TestCommonsApplication.class) +public class NearbyActivityTest { + + private static final LatLng ST_LOUIS_MO_LAT_LNG = new LatLng(38.627003, -90.199402, 0); + + @Mock + LocationServiceManager mockLocationManager; + + private ActivityController activityController; + private NearbyActivity nearbyActivity; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + + AndroidInjector injector = ((TestCommonsApplication) RuntimeEnvironment.application).activityInjector(); + Mockito.doNothing().when(injector).inject(isA(NearbyActivity.class)); + when(mockLocationManager.getLastLocation()).thenReturn(ST_LOUIS_MO_LAT_LNG); + + activityController = Robolectric.buildActivity(NearbyActivity.class); + nearbyActivity = activityController.get(); + nearbyActivity.locationManager = mockLocationManager; + } + + @Test + public void activityLaunchesAndShowsList() { + activityController.create().resume().visible(); + assertNotNull(nearbyActivity.getSupportFragmentManager().findFragmentByTag("NearbyListFragment")); + } + +} \ No newline at end of file diff --git a/app/src/test/java/fr/free/nrw/commons/nearby/NearbyAdapterFactoryTest.java b/app/src/test/java/fr/free/nrw/commons/nearby/NearbyAdapterFactoryTest.java index 76125aa43..c86067ce6 100644 --- a/app/src/test/java/fr/free/nrw/commons/nearby/NearbyAdapterFactoryTest.java +++ b/app/src/test/java/fr/free/nrw/commons/nearby/NearbyAdapterFactoryTest.java @@ -20,13 +20,14 @@ import java.util.Collections; import fr.free.nrw.commons.BuildConfig; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.TestCommonsApplication; import fr.free.nrw.commons.location.LatLng; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @RunWith(RobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 21) +@Config(constants = BuildConfig.class, sdk = 21, application = TestCommonsApplication.class) public class NearbyAdapterFactoryTest { private static final Place PLACE = new Place("name", Place.Description.AIRPORT,