Home | History | Annotate | Download | only in activity-testing
      1 page.title=Creating Unit Tests
      2 trainingnavtop=true
      3 @jd:body
      4 
      5 <!-- This is the training bar -->
      6 <div id="tb-wrapper">
      7 <div id="tb">
      8 
      9 <h2>This lesson teaches you to</h2>
     10 <ol>
     11   <li><a href="#testcase">Create a Test Case for Activity Unit Testing</a>
     12   <li><a href="#test_method">Validate Launch of Another Activity</a>
     13 </ol>
     14 
     15 <h2>Try it out</h2>
     16 <div class="download-box">
     17  <a href="http://developer.android.com/shareables/training/AndroidTestingFun.zip"
     18 class="button">Download the demo</a>
     19  <p class="filename">AndroidTestingFun.zip</p>
     20 </div>
     21 
     22 </div>
     23 </div>
     24 
     25 <p>An {@link android.app.Activity} unit test is an excellent way to quickly
     26 verify the state of an {@link android.app.Activity} and its interactions with
     27 other components in isolation (that is, disconnected from the rest of the
     28 system). A unit test generally tests the smallest possible unit of code
     29 (which could be a method, class, or component), without dependencies on system
     30 or network resources. For example, you can write a unit test to check
     31 that an {@link android.app.Activity} has the correct layout or that it
     32 triggers an {@link android.content.Intent} object correctly.</p>
     33 <p>Unit tests are generally not suitable for testing complex UI interaction
     34 events with the system. Instead, you should use
     35 the {@link android.test.ActivityInstrumentationTestCase2} class, as described
     36 in <a href="activity-ui-testing.html">Testing UI Components</a>.</p>
     37 <p>This lesson shows how you can write a unit test to verify that an
     38 {@link android.content.Intent} is triggered to launch another
     39 {@link android.app.Activity}.
     40 Since the test runs in an isolated environment, the
     41 {@link android.content.Intent}
     42 is not actually sent to the Android system, but you can inspect that the
     43 {@link android.content.Intent} object's payload data is accurate.</p>
     44 <p>For a complete test case example, take a look at
     45 {@code LaunchActivityTest.java} in the sample app.</p>
     46 
     47 <p class="note"><strong>Note: </strong>To test against system or external
     48 dependencies, you can use mock objects from a mocking
     49 framework and inject them into your unit tests. To learn more about the mocking
     50 framework provided by Android, see
     51 <a href="{@docRoot}tools/testing/testing_android.html#MockObjectClasses}">Mock
     52 Object Classes</a>.</p>
     53 
     54 <h2 id="testcase">Create a Test Case for Activity Unit Testing</h2>
     55 <p>The {@link android.test.ActivityUnitTestCase} class provides support for
     56 isolated testing of a single {@link android.app.Activity}. To create a unit
     57 test for your {@link android.app.Activity}, your test class should extend
     58 {@link android.test.ActivityUnitTestCase}.</p>
     59 
     60 <p>The {@link android.app.Activity} in an {@link android.test.ActivityUnitTestCase}
     61 is not automatically started by Android Instrumentation. To start the
     62 {@link android.app.Activity} in isolation, you need to explicitly call the
     63 {@link android.test.ActivityUnitTestCase#startActivity(android.content.Intent, android.os.Bundle, java.lang.Object) startActivity()}
     64 method, and pass in the {@link android.content.Intent} to
     65 launch your target {@link android.app.Activity}.</p>
     66 
     67 <p>For example:</p>
     68 <pre>
     69 public class LaunchActivityTest
     70         extends ActivityUnitTestCase&lt;LaunchActivity&gt; {
     71     ...
     72 
     73     &#64;Override
     74     protected void setUp() throws Exception {
     75         super.setUp();
     76         mLaunchIntent = new Intent(getInstrumentation()
     77                 .getTargetContext(), LaunchActivity.class);
     78         startActivity(mLaunchIntent, null, null);
     79         final Button launchNextButton =
     80                 (Button) getActivity()
     81                 .findViewById(R.id.launch_next_activity_button);
     82     }
     83 }
     84 </pre>
     85 
     86 <h2 id="test_method">Validate Launch of Another Activity</h2>
     87 <p id="test_goals">Your unit testing goals might include:</p>
     88 <ul>
     89 <li>Verifying that {@code LaunchActivity} fires an
     90 {@link android.content.Intent} when a button is pushed clicked.</li>
     91 <li>Verifying that the launched {@link android.content.Intent} contains the
     92 correct payload data.</li>
     93 </ul>
     94 
     95 <p>To verify if an {@link android.content.Intent} was triggered
     96 following the {@link android.widget.Button} click, you can use the
     97 {@link android.test.ActivityUnitTestCase#getStartedActivityIntent()} method.
     98 By using assertion methods, you can verify that the returned
     99 {@link android.content.Intent} is not null, and that it contains the expected
    100 string value to launch the next {@link android.app.Activity}. If both assertions
    101 evaluate to {@code true}, you've successfully verified that the
    102 {@link android.content.Intent} was correctly sent by your
    103 {@link android.app.Activity}.</p>
    104 
    105 <p>You might implement your test method like this:</p>
    106 <pre>
    107 &#64;MediumTest
    108 public void testNextActivityWasLaunchedWithIntent() {
    109     startActivity(mLaunchIntent, null, null);
    110     final Button launchNextButton =
    111             (Button) getActivity()
    112             .findViewById(R.id.launch_next_activity_button);
    113     launchNextButton.performClick();
    114 
    115     final Intent launchIntent = getStartedActivityIntent();
    116     assertNotNull("Intent was null", launchIntent);
    117     assertTrue(isFinishCalled());
    118 
    119     final String payload =
    120             launchIntent.getStringExtra(NextActivity.EXTRAS_PAYLOAD_KEY);
    121     assertEquals("Payload is empty", LaunchActivity.STRING_PAYLOAD, payload);
    122 }
    123 </pre>
    124 <p>Because {@code LaunchActivity} runs in isolation, you cannot use the
    125 {@link android.test.TouchUtils} library to manipulate UI controls. To directly
    126 click a {@link android.widget.Button}, you can call the
    127 {@link android.view.View#performClick()} method instead.</p>
    128 
    129 
    130 
    131 
    132 
    133 
    134 
    135