Tester onActivityResult ()

J’ai l’activité suivante:

package codeguru.startactivityforresult; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class StartActivityForResult extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.startButton = (Button) this.findViewById(R.id.start_button); this.startButton.setOnClickListener(onStart); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { int result = data.getIntExtra(StartActivityForResult.this.getSsortingng(R.ssortingng.result), -1); Ssortingng msg = "requestCode=" + requestCode + ", resultCode=" + resultCode + ", result=" + result; Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); } private View.OnClickListener onStart = new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(StartActivityForResult.this, ChildActivity.class); StartActivityForResult.this.startActivityForResult(intent, R.id.child_request); } }; private Button startButton = null; } 

Et le test JUnit suivant:

 package codeguru.startactivityforresult; import android.app.Activity; import android.app.Instrumentation; import android.test.ActivityInstrumentationTestCase2; import android.test.UiThreadTest; import android.widget.Button; import junit.framework.Assert; public class StartActivityForResultTest extends ActivityInstrumentationTestCase2 { public StartActivityForResultTest() { super(StartActivityForResult.class); } @Override public void setUp() throws Exception { super.setUp(); this.setActivityInitialTouchMode(false); this.activity = this.getActivity(); this.startButton = (Button) this.activity.findViewById(R.id.start_button); } @Override public void tearDown() throws Exception { this.activity.finish(); super.tearDown(); } @UiThreadTest public void testStartButtonOnClick() { Assert.assertTrue(this.startButton.performClick()); Instrumentation.ActivityResult result = new Instrumentation.ActivityResult(Activity.RESULT_OK, null); Assert.assertNotNull(result); Instrumentation.ActivityMonitor am = new Instrumentation.ActivityMonitor(ChildActivity.class.getName(), result, true); Assert.assertNotNull(am); Activity childActivity = this.getInstrumentation().waitForMonitorWithTimeout(am, TIME_OUT); Assert.assertNotNull(childActivity); Assert.fail("How do I check that StartActivityForResult correctly handles the returned result?"); } private Activity activity = null; private Button startButton = null; private static final int TIME_OUT = 5 * 1000; // 5 seconds } 

Comme vous pouvez le constater, j’ai compris comment simuler un résultat à l’aide d’ Instrumentation.ActivityResult et d’ Instrumentation.ActivityMonitor . Comment vérifier que StartActivityForResult.onActivityResult() gère correctement ce résultat?

Utiliser le cadre d’intentions pour simuler le résultat de l’activité

 intending(hasComponent(DummyActivity.class.getName())).respondWith(new ActivityResult(resultCode, dataIntent)); rule.getActivity().startActivityForResult(new Intent(context,DummyActivity.class)); 

vérifier la logique du résultat de l’activité

Pour tester onActivityResult () dans votre classe de test, il vous suffit de:

  1. Créez un ActivityMonitor qui capture la création de ChildActivity et réaccorde le faux ActivityResult.
  2. En simulant le bouton, cliquez pour lancer ChildActivity pour le résultat.
  3. Faites quelques assertions sur le statut et le faux ActivityResult.

Exemple de StartActivityForResult:

 public class StartActivityForResult extends Activity { private boolean activityResultIsReturned = false; private Ssortingng activityResult = null; ... ... @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { activityResultIsReturned = true; activityResult = data.getSsortingngExtra("result"); ... ... } ... ... } 

Exemple de test StartActivityForResultTest:

 public class StartActivityForResultTest extends ActivityInstrumentationTestCase2 { ... ... public void testOnActivityResult() { // Get current Activity and check initial status: StartActivityForResult myActivity = getActivity(); assertFalse(myActivity.getActivityResultIsReturned()); assertNull(myActivity.getActiityResult()); // Mock up an ActivityResult: Intent returnIntent = new Intent(); returnIntent.putExtra("result", "This is the result"); Instrumentation.ActivityResult activityResult = new Instrumentation.ActivityResult(Activity.RESULT_OK, returnIntent); // Create an ActivityMonitor that catch ChildActivity and return mock ActivityResult: Instrumentation.ActivityMonitor activityMonitor = getInstrumentation().addMonitor(ChildActivity.class.getName(), activityResult , true); // Simulate a button click that start ChildActivity for result: final Button button = (Button) myActivity.findViewById(com.company.R.id.open_next_activity); myActivity.runOnUiThread(new Runnable() { @Override public void run() { // click button and open next activity. button.performClick(); } }); // Wait for the ActivityMonitor to be hit, Instrumentation will then return the mock ActivityResult: ChildActivity childActivity = getInstrumentation().waitForMonitorWithTimeout(activityMonitor, 5); // How do I check that StartActivityForResult correctly handles the returned result? assertTrue(myActivity.getActivityResultIsReturned()); assertEqual(myActivity.getActiityResult(), "This is the result"); } ... ... }