在Android Instrumentation测试用例中测试GoogleApiClient



我正在用ActivityInstrumentationTestCase2编写一个活动的测试用例。在这个活动中,我使用GoogleApiClient来获取用户的位置。我想要断言GoogleApiClient是连接的。

这是我写的测试用例

@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);
 }
 }

但是我在运行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)

我已经解决了。实际上,我必须传递应用程序上下文,而不是测试应用程序上下文。

我们可以像下面的一样通过正在测试的应用程序的上下文

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);
}
 }

相关内容

  • 没有找到相关文章

最新更新