Android 是否有方法将类变量传递给Espresso ActivityTestRule?
我正在为使用浓缩咖啡的活动编写测试。对于每个活动,测试都是这样的Android 是否有方法将类变量传递给Espresso ActivityTestRule?,android,kotlin,android-intent,android-espresso,Android,Kotlin,Android Intent,Android Espresso,我正在为使用浓缩咖啡的活动编写测试。对于每个活动,测试都是这样的 @RunWith(AndroidJUnit4::class) class TestSomeActivity { @get:Rule var activityTestRule = ActivityTestRule(SomeActivity::class.java, true, false) @Test fun testNullIntent() { val intent = Intent
@RunWith(AndroidJUnit4::class)
class TestSomeActivity {
@get:Rule
var activityTestRule = ActivityTestRule(SomeActivity::class.java, true, false)
@Test
fun testNullIntent() {
val intent = Intent()
activityTestRule.launchActivity(intent)
}
}
这样做的目的是,每当该活动中的意图调用Intent.getExtra
,就会返回null
问题是,如果我们要为每一个活动检查这一点,除了这一行之外,必须编写相同的代码-
@get:Rule
var activityTestRule = ActivityTestRule(SomeActivity::class.java, true, false)
为了解决这个问题,我使用PackageManager
获得了所有活动的名称,并将它们转换为Class
。然后,我尝试将该类传递给我的activityTestRule
val intent = Intent()
val activityInfoList = getAllActivities()
for(activityInfo in activityInfoList!!) {
val className = activityInfo.applicationInfo.className
val activityClass = Class.forName(className)
val activityTestRule = ActivityTestRule(activityClass.javaClass, true, false)
activityTestRule.launchActivity(intent)
}
不幸的是,这导致了编译时错误-
None of the following functions can be called with the arguments supplied.
<init>(SingleActivityFactory<T!>!, Boolean, Boolean) where T cannot be inferred for constructor ActivityTestRule<T : Activity!>(activityFactory: SingleActivityFactory<T!>!, initialTouchMode: Boolean, launchActivity: Boolean) defined in androidx.test.rule.ActivityTestRule
<init>(Class<T!>!, Boolean, Boolean) where T cannot be inferred for constructor ActivityTestRule<T : Activity!>(activityClass: Class<T!>!, initialTouchMode: Boolean, launchActivity: Boolean) defined in androidx.test.rule.ActivityTestRule
这消除了编译时错误,但引入了java.lang.ClassCastException:java.lang.Class不能强制转换为android.app.Activity
有没有办法为类中的所有活动运行相同的浓缩咖啡脚本,或者将
类
传递给ActivityTestRule?而不是这段代码
val activityClass = Class.forName(className) as Activity
您可以使用以下命令
val activityClass = Class.forName(className) as Class<Activity>
val activityClass=Class.forName(className)作为类
这将确保不会出现编译时错误,并且在运行代码后不会发生类型转换异常
val activityClass = Class.forName(className) as Class<Activity>