使用ServiceTestRule的bindService方法的ClassCastException

时间:2017-09-06 20:44:50

标签: android junit kotlin

我编写了一个使用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课程中获得一个绑定服务。如果我尝试在同一个类中获得另一个绑定服务,它将失败并出现相同的错误。

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

1 个答案:

答案 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。