1

我正在使用 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)
4

1 回答 1

1

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

我们可以传递正在测试的应用程序的上下文,如下所示

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

 }
于 2016-01-28T13:17:15.013 回答