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 に答える