An Activity unit test is an excellent way to quickly
verify the state of an Activity and its interactions with
other components in isolation (that is, disconnected from the rest of the
system). A unit test generally tests the smallest possible unit of code
(which could be a method, class, or component), without dependencies on system
or network resources. For example, you can write a unit test to check
that an Activity has the correct layout or that it
triggers an Intent object correctly.
Unit tests are generally not suitable for testing complex UI interaction
events with the system. Instead, you should use
the ActivityInstrumentationTestCase2 class, as described
in Testing UI Components.
This lesson shows how you can write a unit test to verify that an
Intent is triggered to launch another
Activity.
Since the test runs in an isolated environment, the
Intent
is not actually sent to the Android system, but you can inspect that the
Intent object's payload data is accurate.
For a complete test case example, take a look at
LaunchActivityTest.java in the sample app.
Note: To test against system or external dependencies, you can use mock objects from a mocking framework and inject them into your unit tests. To learn more about the mocking framework provided by Android, see Mock Object Classes.
Create a Test Case for Activity Unit Testing
The ActivityUnitTestCase class provides support for
isolated testing of a single Activity. To create a unit
test for your Activity, your test class should extend
ActivityUnitTestCase.
The Activity in an ActivityUnitTestCase
is not automatically started by Android Instrumentation. To start the
Activity in isolation, you need to explicitly call the
startActivity()
method, and pass in the Intent to
launch your target Activity.
For example:
public class LaunchActivityTest
extends ActivityUnitTestCase<LaunchActivity> {
...
@Override
protected void setUp() throws Exception {
super.setUp();
mLaunchIntent = new Intent(getInstrumentation()
.getTargetContext(), LaunchActivity.class);
startActivity(mLaunchIntent, null, null);
final Button launchNextButton =
(Button) getActivity()
.findViewById(R.id.launch_next_activity_button);
}
}
Validate Launch of Another Activity
Your unit testing goals might include:
- Verifying that
LaunchActivityfires anIntentwhen a button is pushed clicked. - Verifying that the launched
Intentcontains the correct payload data.
To verify if an Intent was triggered
following the Button click, you can use the
getStartedActivityIntent() method.
By using assertion methods, you can verify that the returned
Intent is not null, and that it contains the expected
string value to launch the next Activity. If both assertions
evaluate to true, you've successfully verified that the
Intent was correctly sent by your
Activity.
You might implement your test method like this:
@MediumTest
public void testNextActivityWasLaunchedWithIntent() {
startActivity(mLaunchIntent, null, null);
final Button launchNextButton =
(Button) getActivity()
.findViewById(R.id.launch_next_activity_button);
launchNextButton.performClick();
final Intent launchIntent = getStartedActivityIntent();
assertNotNull("Intent was null", launchIntent);
assertTrue(isFinishCalled());
final String payload =
launchIntent.getStringExtra(NextActivity.EXTRAS_PAYLOAD_KEY);
assertEquals("Payload is empty", LaunchActivity.STRING_PAYLOAD, payload);
}
Because LaunchActivity runs in isolation, you cannot use the
TouchUtils library to manipulate UI controls. To directly
click a Button, you can call the
performClick() method instead.