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
LaunchActivity
fires anIntent
when a button is pushed clicked. - Verifying that the launched
Intent
contains 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.