我编写了一个使用ServiceTestRule获取绑定服务的函数,如下所示:
class Parent {
companion object {
fun <T : AbstractUIService> getBoundService(clazz: Class<T>): T {
var binder: IBinder? = null
while (binder == null) {
binder = serviceTestRule.bindService(
Intent(InstrumentationRegistry.getTargetContext().applicationContext, clazz))
}
return (binder as LocalBinder<T>).service
}
}
}
此类由具有测试用例的类继承。我在子类的伴侣对象的@BeforeClass函数中使用此函数获得“绑定服务”。
class ChildATests: Parent() {
companion object {
lateinit var serviceA: ServiceA
@BeforeClass @JvmStatic
fun setUp() {
serviceA = getBoundService(ServiceA::class.java)
}
}
}
如果我必须只运行一个Child * Tests类,这可以正常工作。但是当我运行整个套件时,第一个类运行正常,但其余类失败并出现以下错误:
java.lang.ClassCastException:ServiceB无法强制转换为ServiceA
请注意,我只能在Child * Tests课程中获得一个绑定服务。如果我尝试在同一个类中获得另一个绑定服务,它将失败并出现相同的错误。
如果需要更多细节来澄清情况,请告诉我。
答案 0 :(得分:0)
此问题的解决方案是将ServiceConnection适配器与ServiceTestRule的bindService方法一起使用。所以我的getBoundService函数现在看起来像这样:
fun <T : AbstractUIService> getBoundService(clazz: Class<T>): T {
val serviceConnectionAdapter = doOperationWithLatch {
val adapter = ServiceConnectionAdapter(it)
serviceTestRule.bindService(
Intent(InstrumentationRegistry.getTargetContext().applicationContext, clazz),
adapter,
Context.BIND_AUTO_CREATE
)
adapter
} as ServiceConnectionAdapter
return (serviceConnectionAdapter.service as LocalBinder<T>).service
}
其中it
是CountDownLatch。