John
John

Reputation: 8946

Testing GoogleApiClient in Android Instrumentation TestCase

I am writing a testcase of activity with ActivityInstrumentationTestCase2. In this activity I am using GoogleApiClient to get the location of the user. I want the assert that GoogleApiClient is connected.

This is the testcase i wrote

@RunWith(AndroidJUnit4.class)
public class SplashActivityTest
extends ActivityInstrumentationTestCase2<SplashScreenActivity>{

private SplashScreenActivity splashScreenActivity;
private TextView messageText;
private ProgressBar progressBar;
private boolean isLocationCallbackCalled;
private long LOCATION_TIMEOUT = 10000;
private GoogleApiClient mGoogleApiClient;


public SplashActivityTest() {
 super(SplashScreenActivity.class);
}

@Before public void setUp() throws Exception {
super.setUp();

injectInstrumentation(InstrumentationRegistry.getInstrumentation());
splashScreenActivity = getActivity();
messageText = (TextView) splashScreenActivity.findViewById(R.id.textView2);
progressBar = (ProgressBar) splashScreenActivity.findViewById(R.id.progressBar);

mGoogleApiClient =
    new GoogleApiClient.Builder(getInstrumentation().getContext())
        .addApi(LocationServices.API)
        .build();
mGoogleApiClient.connect();

 }

@Test public void testGoogleApiClientConnected() {
assertEquals("Google api client not connected", mGoogleApiClient.isConnected(), true);
 }
 }

But i am getting this error while running the TestCase

java.lang.IllegalArgumentException: isGooglePlayServicesAvailable should only be called with Context from your application's package. A previous call used package 'com.example.myapp' and this call used package 'com.example.myapp.test'.
at com.google.android.gms.common.zze.zzan(Unknown Source)
at com.google.android.gms.common.zze.isGooglePlayServicesAvailable(Unknown Source)
at com.google.android.gms.common.zzc.isGooglePlayServicesAvailable(Unknown Source)
at com.google.android.gms.common.api.internal.zzh$zzb.zzpt(Unknown Source)
at com.google.android.gms.common.api.internal.zzh$zzf.run(Unknown Source)

Upvotes: 1

Views: 670

Answers (1)

John
John

Reputation: 8946

I Have solved it. Actually i have to pass Application context not the test application context.

we can pass the context of the application which is being tested like below

public class SplashActivityTest
  extends ActivityInstrumentationTestCase2<SplashScreenActivity> {

private SplashScreenActivity splashScreenActivity;
private TextView messageText;
private ProgressBar progressBar;
private boolean isLocationCallbackCalled;
private long TIMEOUT_IN_MS = 10000;
private GoogleApiClient mGoogleApiClient;
// register next activity that need to be monitored.
Instrumentation.ActivityMonitor homeActivityMonitor;

public SplashActivityTest() {
  super(SplashScreenActivity.class);
}

@Before public void setUp() throws Exception {
  super.setUp();
  injectInstrumentation(InstrumentationRegistry.getInstrumentation());

  homeActivityMonitor = getInstrumentation().addMonitor(HomeScreenActivity.class.getName(), null, false);

  splashScreenActivity = getActivity();
  messageText = (TextView) splashScreenActivity.findViewById(R.id.textView2);
  progressBar = (ProgressBar) splashScreenActivity.findViewById(R.id.progressBar);

  final CountDownLatch latch = new CountDownLatch(1);
  mGoogleApiClient =
      new GoogleApiClient.Builder(splashScreenActivity).addApi(LocationServices.API)
          .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
            @Override public void onConnected(Bundle bundle) {
              latch.countDown();
            }

            @Override public void onConnectionSuspended(int i) {
              latch.countDown();
            }
          })
          .build();
  mGoogleApiClient.connect();
  latch.await();
}

@Test public void testPreconditions() {
  //Try to add a message to add context to your assertions. These messages will be shown if
  //a tests fails and make it easy to understand why a test failed
  assertNotNull("splashScreenActivity is null", splashScreenActivity);
  assertNotNull("messageText is null", messageText);
  assertNotNull("progressBar is null", progressBar);
}

@Test public void testPlayServiceVersion() {
  splashScreenActivity.runOnUiThread(new Runnable() {
    @Override public void run() {
      assertEquals("Wrong PlayService version", true,
          AppUtils.checkPlayServices(splashScreenActivity));
    }
  });
}

@Test public void testLocationRuntimePermissionsGranted() {
  getInstrumentation().runOnMainSync(new Runnable() {
    @Override public void run() {
      assertEquals("NO GPS Permission Granted", PackageManager.PERMISSION_GRANTED,
          ContextCompat.checkSelfPermission(splashScreenActivity,
              android.Manifest.permission.ACCESS_FINE_LOCATION));
    }
  });
}

@Test public void testGoogleApiClientConnected() {
  assertEquals("Google api client not connected", true, mGoogleApiClient.isConnected());
}

@After public void tearDown() {
  getInstrumentation().removeMonitor(homeActivityMonitor);
}

 }

Upvotes: 1

Related Questions