我正在用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);
}
}