首页 > 解决方案 > espresso ActivityTestRule 用于具有泛型类型参数的活动

问题描述

我已经宣布了这样的活动

class QuestionnaireActivity<T : ProfileModel> : AppCompatActivity()

我想写一个浓缩咖啡测试,所以我在写 ActivityTestRule 之类的

@Rule @JvmField
val activityRule = object : ActivityTestRule<QuestionnaireActivity<ProfileModel.PersonalInfo>>(QuestionnaireActivity<ProfileModel.LifeStyleInfo>::class.java){
    override fun getActivityIntent(): Intent = QuestionnaireActivity.getQuestionnaireIntent(InstrumentationRegistry.getTargetContext(), 3, ProfileModel.LifeStyleInfo())
}

但编译器抱怨(它关于 ActivityTestRule 的参数)

only classes are allowed on the left hand side of a class literal

这里声明泛型不能与class一起使用。

如果我删除泛型类型参数,则错误变为

 Type inference failed.
 Expected type mismatch: inferred type is Class<QuestionnaireActivity<*>> but Class<QuestionnaireActivity<ProfileModel.PersonalInfo>!>! was expected    

我应该怎么办?

感谢您的关注

标签: androidkotlinandroid-espresso

解决方案


此处类似,解决方案涉及定义这样的内联函数

inline fun <reified T: Activity> activityTestRuleWithIntent(intent: Intent) =  object : ActivityTestRule<T>(T::class.java){
    override fun getActivityIntent(): Intent = intent
}

那么规则变为:

@Rule @JvmField
val rule = activityTestRuleWithIntent<QuestionnaireActivity<ProfileModel.LifeStyleInfo>>(QuestionnaireActivity.getQuestionnaireIntent(InstrumentationRegistry.getTargetContext(), 3, ProfileModel.LifeStyleInfo()))

推荐阅读