gpt4 book ai didi

android - ClassCastException 与 ServiceTestRule 的 bindService 方法

转载 作者:行者123 更新时间:2023-11-30 00:22:07 30 4
gpt4 key购买 nike

我写了一个使用ServiceTestRule获取绑定(bind)服务的函数,如下:

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 函数中使用这个函数获得了“绑定(bind)服务”。

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 类中获得一项绑定(bind)服务。如果我尝试在同一个类中获取另一个绑定(bind)服务,它会失败并出现相同的错误。

如果需要更多细节来澄清情况,请告诉我。

最佳答案

此问题的解决方案是将 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
}

其中 是一个 CountDownLatch。

关于android - ClassCastException 与 ServiceTestRule 的 bindService 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46084061/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com