测试你的Service
如果你实现了一个本地Service作为你的App组件,你应该测试Service来确保它不会表现出未预期的方式。你可以创建instrumented单元测试来验证Service的表现是正确。比如,这个Service存储和返回正确的数据值并且可以争取的执行数据操作。
Android Testing Support Library 提供了测试你的Service对象的Api,以隔离的方式。ServiceTestRule类是一个JUnit 4 规则它在你的单元测试方法运行之前启动你的Service,在测试完成的时候关闭Service。通过使用这个测试规则,你可以确保在你的测试方法运行之前你的Service的连接总是建立的。为了学习更多关于JUnit 4规则,参见 Junit documentation 。
注意:ServiceTestRule 类不支持测试IntentService对象。如果你需要测试IntentService对象,你应该在一个独立的类中加入逻辑同时创建一个相匹配的单元测试。
设置你的测试环境
在你构建service的集成测试之前,确保你的工程按照开始你的测试中描述的那样配置了你的测试代码目录和工程依赖。
为你的Service创建一个集成测试
你的集成测试应该被写作一个Junit 4测试类。为了学习更多创建JUnit 4测试类和使用 Junit 4 断言方法,查看Create an Instrumented Unit Test Class.
为了创建一个service的集成测试,在你的测试类开始定义的地方添加@RunWith(AndroidJUnit4.class)注解。你也需要具体声明一个AndroidJUnitRunner 类,Android Testing Support Library 提供的作为你的默认测试运行器。这个步骤已经在[Run Instrumented Unit Tests](Run Instrumented Unit Tests)中进行了详细的描述。
接下来用@Rule 注解在你的测试中来创建ServiceTestRule实例。
@Rule
public final ServiceTestRule mServiceRule = new ServiceTestRule();
下面的实例向你展示了你该如何为service实现一个集成测试。测试方法 testWithBoundService 确保App成功绑定到了本地service并且service的接口表现正确。
@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)));
}
运行Services的集成测试
你可以从Android Studio或者命令行运行集成测试。确保在你的工程中声明了AndroidJUnitRunner作为默认的instrumentation runner 。
为了运行你的Service集成测试,按照开始你的测试中描述的步骤来运行instrumented测试。