Prueba onActivityResult ()

Tengo la siguiente Actividad:

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.getString(R.string.result), -1); String 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; } 

Y la siguiente prueba JUnit:

 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<StartActivityForResult> { 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 } 

Como se puede ver, me di cuenta de cómo simular un resultado utilizando Instrumentation.ActivityResult y Instrumentation.ActivityMonitor . ¿Cómo puedo comprobar que StartActivityForResult.onActivityResult() maneja correctamente este resultado?

Para probar onActivityResult () en su clase de prueba, todo lo que necesita hacer es:

  1. Cree un ActivityMonitor que capture la creación de ChildActivity y reajuste el ActivityResult.
  2. Simular el clic del botón que inicia ChildActivity para el resultado.
  3. Haga alguna afirmación sobre el estado y el simulacro ActivityResult.

Ejemplo StartActivityForResult:

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

Ejemplo StartActivityForResultTest:

 public class StartActivityForResultTest extends ActivityInstrumentationTestCase2<StartActivityForResult> { ... ... 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"); } ... ... } 
  • Envío de mayúsculas a un TextEdit durante pruebas instrumentadas
  • ClassNotFoundException durante el instrumento de prueba de Android
  • Android: ¿Cómo puedo guardar, borrar y restaurar SharedPreferences para la prueba de unidades?
  • ¿Cómo puedo ejecutar el código en el hilo de la interfaz de usuario en una prueba de Android JUnit sin una actividad?
  • Prueba de GPS en Android
  • ¿Hay un comando ADB para habilitar / deshabilitar datos móviles? (Dispositivo enraizado)
  • ¿Cómo forzar un cambio de orientación en una prueba de instrumentación de Android?
  • ¿Por qué no hay instrumentación de prueba para BroadcastReceiver?
  • Mockito en el emulador de Android
  • Carpeta de activos en Android Studio Unit Test
  • La forma más rápida de probar el código fuente de Android modificado?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.