Android 开发 Service 测试
Android 为 Service 对象提供了一套测试框架,框架可以独立的运行,并且提供了模拟对象。这个测试用例类的名字叫做 ServiceTestCase 。因为这个 Service 类是独立于客户端的,所以,你不用使用 instrumentation
就可以测试 Service 对象。
这篇文档描述了测试 Service 对象的技术。如果你对 Service 不熟悉,请阅读 Service 文档。如果你不熟悉 Android 测试,请阅读介绍 Android 测试和 instrumentation 框架的 测试文档 。
Service 设计和测试
当你设计一个 Service 的时候,你应该考虑你的测试用例怎么样才能测试 Service 的整个生命周期。如果启动了 Service,比如调用了 onCreate()
或者 onStartCommand()
,但并没有设置一个检测是否成功的全局变量,你可能想要提供一个以测试为目的的变量。
大多数其他的测试可以通过 ServiceTestCase 的测试用例类来方便地进行测试。例如, getService()
方法在测试中返回一个处理 Service 的句柄,通过这个句柄你可以确定 Service 是否正在运行。
ServiceTestCase
ServiceTestCase 扩展了 JUnit 测试用例 ,添加测试应用权限、控制应用和 Service 的方法。它还提供了独立于系统的 mock application 和 Context 对象。
ServiceTestCase) 会在你调用 ServiceTestCase.startService()
或 ServiceTestCase.bindService()
的时候初始化测试环境。这是为了允许你在启动 Service 之前初始化测试环境,尤其是你的 mock 对象。
注意: Service.bindService()
的参数不同于 ServiceTestCase.bindService()
。因为 ServiceTestCase
的版本,你只能提供一个 Intent
。 ServiceTestCase.bindService()
会返回一个 IBinder 子对象,代替一个 boolean
值。
ServiceTestCase 中的 setUp()
方法会在每次测试的时候调用。任何方法调用它,它都会创建一个当前系统的上下文的拷贝。你可以通过调用 getSystemContext()
查看这个上下文对象。如果,你重写该方法,你必须在重写的方法中首先调用 super.setUp()
。
setApplication()
和 setContext(Context) setContext()
允许你在开启 Service 之前为 Service 设置一个模拟的 Context
和 Application
(或者两者)。这些模拟的对象在 模拟对象集合 中。
默认情况下,ServiceTestCase 运行 testAndroidTestCaseSetupProperly()
方法,去声明在测试启动之前已经成功的创建 Context
。
模拟对象集合
ServiceTestCase 假定你在测试环境中将会使用模拟的 Context
和 Application
(或者两者)。这些对象是跟系统分离的。如果你在启动 Service 之前不创建这些对象的实例,那么,ServiceTestCase 会创建它内部的实例并将它们注入到 Service 中。你可以在开启 Service 之前通过创建和注入你自己的实例对象来实现这一功能。
在测试的时候,将一个模拟对象注入到 Service 中。 首先,创建一个 MockApplication 的子类。 MockApplication
是 Applicatoin 的子类。然后,使用 setApplication()
将它注入到 Service 中。这个模拟对象允许你操作 Service 中的值,并且不受真实的系统影响。另外,当你运行测试的时候,你的 Service 中任何隐藏的应用依赖将会被当做异常处理。
在测试中,你使用 setContext()
方法注入一个模拟 Context
到 Service 中。在 基础测试 中,模拟的 Context
可以描述更多细节。
测试什么
测试什么这一主题下列出了测试 android 组件一般需要考虑的问题。这些是测试 Service 的具体指导:
确保调用 Context.startService()
或 Context.bindService()
时 onCreate()
做出了响应。同理,调用 Context.stopService()
, Context.unbindService()
, stopSelf()
, 或者 stopSelfResult()
时 onDestroy()
做出了响应。
多次调用 Context.startService()
只有第一次才会触发 Service.onCreate()
方法,但是所有的调用都会触发 Service.onStartCommand()
。
另外,记着 startService()
不能够嵌套调用。所以, Context.stopService()
或者 Service.stopSelf()
(不是 stopSelf(int)
)任意一个方法都可以停止 Service。你应该测试你的 Service 是不是在正确的时间点关闭。 测试 Service 中的每个业务逻辑。业务逻辑包括无效值的检查,算法的计算等等。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
下一篇: 自动化截图-应用分发时的自动截图方案
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论