| page.title=Testing Your Service |
| page.tags=testing, service |
| trainingnavtop=true |
| |
| @jd:body |
| |
| <!-- This is the training bar --> |
| <div id="tb-wrapper"> |
| <div id="tb"> |
| <h2>Dependencies and Prerequisites</h2> |
| |
| <ul> |
| <li>Android 2.2 (API level 8) or higher</li> |
| <li><a href="{@docRoot}tools/testing-support-library/index.html"> |
| Android Testing Support Library</a></li> |
| <li><a href="{@docRoot}tools/studio/index.html">Android Studio 1.4.1 or higher</a>.</li> |
| </ul> |
| |
| <h2>This lesson teaches you to</h2> |
| |
| <ol> |
| <li><a href="#setup">Set Up Your Testing Environment</a></li> |
| <li><a href="#build">Create an Integrated Test for Services</a></li> |
| <li><a href="#run">Run Integration Tests for Services</a></li> |
| </ol> |
| |
| <h2>You should also read</h2> |
| <ul> |
| <li><a href="{@docRoot}guide/components/services.html">Services</a></li> |
| </ul> |
| |
| <h2>Try it out</h2> |
| |
| <ul> |
| <li> |
| <a href="https://github.com/googlesamples/android-testing/tree/master/integration/ServiceTestRuleSample" |
| class="external-link">Service Test Code Samples</a></li> |
| </ul> |
| </div> |
| </div> |
| |
| <p> |
| If you are implementing a local {@link android.app.Service} as a component of |
| your app, you should test the {@link android.app.Service} to ensure that it doesn't behave in an |
| unexpected way. You can create |
| <a href="{@docRoot}training/testing/unit-testing/instrumented-unit-tests.html"> |
| instrumented unit tests</a> to verify that the behavior in the {@link android.app.Service} |
| is correct; for example, the service stores and returns valid data values and performs |
| data operations correctly. |
| </p> |
| |
| <p> |
| The <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a> |
| provides an API for testing your {@link android.app.Service} objects in isolation. |
| The |
| <a href="{@docRoot}reference/android/support/test/rule/ServiceTestRule.html">ServiceTestRule</a> |
| class is a JUnit 4 rule that starts your service before your unit test methods |
| run, and shuts down the service after tests complete. By using this test rule, you ensure that the |
| connection to the service is always established before your test method runs. To |
| learn more about JUnit 4 rules, see the <a href="https://github.com/junit-team/junit/wiki/Rules" |
| class="external-link">JUnit documentation</a>. |
| </p> |
| |
| <p style="note"> |
| <strong>Note</strong>: The |
| <a href="{@docRoot}reference/android/support/test/rule/ServiceTestRule.html">ServiceTestRule</a> |
| class does not support testing of {@link android.app.IntentService} objects. |
| If you need to test a {@link android.app.IntentService} object, you should encapsulate the logic |
| in a separate class and create a corresponding unit test instead. |
| </p> |
| |
| <h2 id="setup">Set Up Your Testing Environment</h2> |
| <p>Before building your integration test for the service, make sure to configure your project for |
| instrumented tests, as described in |
| <a href="{@docRoot}training/testing/start/index.html#config-instrumented-tests"> |
| Getting Started with Testing</a>.</p> |
| |
| <h2 id="build">Create an Integration Test for Services</h2> |
| <p>Your integration test should be written as a JUnit 4 test class. To learn more about creating |
| JUnit 4 test classes and using JUnit 4 assertion methods, see |
| <a href="{@docRoot}training/testing/unit-testing/instrumented-unit-tests.html#build"> |
| Create an Instrumented Unit Test Class</a>.</p> |
| |
| <p>To create an integration test for your service, add the {@code @RunWith(AndroidJUnit4.class)} |
| annotation at the beginning of your test class definition. You also need to specify the |
| <a href="{@docRoot}reference/android/support/test/runner/AndroidJUnitRunner.html"> |
| {@code AndroidJUnitRunner}</a> class that the Android Testing Support Library provides as your |
| default test runner. This step is described in more detail in |
| <a href="{@docRoot}training/testing/unit-testing/instrumented-unit-tests.html#run"> |
| Run Instrumented Unit Tests</a>.</p> |
| |
| <p>Next, create a |
| <a href="{@docRoot}reference/android/support/test/rule/ServiceTestRule.html">ServiceTestRule</a> |
| instance in your test by using the {@code @Rule} annotation.</p> |
| |
| <pre> |
| @Rule |
| public final ServiceTestRule mServiceRule = new ServiceTestRule(); |
| </pre> |
| |
| <p>The following example shows how you might implement an integration test for a service. |
| The test method {@code testWithBoundService} verifies that the app binds successfully to a |
| local service and that the service interface behaves correctly.</p> |
| |
| <pre> |
| @Test |
| public void testWithBoundService() throws TimeoutException { |
| // Create the service Intent. |
| Intent serviceIntent = |
| new Intent(InstrumentationRegistry.getTargetContext(), |
| LocalService.class); |
| |
| // Data can be passed to the service via the Intent. |
| serviceIntent.putExtra(LocalService.SEED_KEY, 42L); |
| |
| // Bind the service and grab a reference to the binder. |
| IBinder binder = mServiceRule.bindService(serviceIntent); |
| |
| // Get the reference to the service, or you can call |
| // public methods on the binder directly. |
| LocalService service = |
| ((LocalService.LocalBinder) binder).getService(); |
| |
| // Verify that the service is working correctly. |
| assertThat(service.getRandomInt(), is(any(Integer.class))); |
| } |
| </pre> |
| |
| <h2 id="run">Run Integration Tests for Services</h2> |
| <p> |
| You can run integration tests from <a href="{@docRoot}studio/index.html">Android Studio</a> or |
| from the command-line. Make sure to specify |
| <a href="{@docRoot}reference/android/support/test/runner/AndroidJUnitRunner.html"> |
| {@code AndroidJUnitRunner}</a> as the default instrumentation runner in your project. |
| </p> |
| <p> |
| To run the integration test for your service, follow the steps for running instrumented tests |
| described in <a href="{@docRoot}training/testing/start/index.html#run-instrumented-tests"> |
| Getting Started with Testing</a>. |
| </p> |