I have the following Activity:
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;
}
And the following JUnit test:
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
}
As you can see, I figured out how to mock up a result using Instrumentation.ActivityResult
and Instrumentation.ActivityMonitor
. How do I check that StartActivityForResult.onActivityResult()
properly handles this result?
onActivityResult is the callback you have on the first activity to grab the contacts you choose. Follow this answer to receive notifications.
When you done with the subsequent activity and returns, the system calls your activity's onActivityResult() method. This method includes three arguments: @The request code you passed to startActivityForResult() . @A result code specified by the second activity.
Use intents framework to mock the activity result
intending(hasComponent(DummyActivity.class.getName())).respondWith(new ActivityResult(resultCode, dataIntent));
rule.getActivity().startActivityForResult(new Intent(context,DummyActivity.class));
verify on activity result logic
For testing onActivityResult() in your test class, all you need to do is:
Sample 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");
... ...
}
... ...
}
Sample 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");
}
... ...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With