activity 的 espresso ActivityTestRule 具有通用类型参数
espresso ActivityTestRule for activity with generic type parameter
我已经声明了一个这样的activity
class QuestionnaireActivity<T : ProfileModel> : AppCompatActivity()
我想写一个 espresso 测试,所以我正在写 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
我该怎么办?
感谢您的关注
与 here 类似,解决方案涉及定义这样的内联函数
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()))
我已经声明了一个这样的activity
class QuestionnaireActivity<T : ProfileModel> : AppCompatActivity()
我想写一个 espresso 测试,所以我正在写 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
声明
如果我删除通用类型参数,错误将变为
Type inference failed.
Expected type mismatch: inferred type is Class<QuestionnaireActivity<*>> but Class<QuestionnaireActivity<ProfileModel.PersonalInfo>!>! was expected
我该怎么办?
感谢您的关注
与 here 类似,解决方案涉及定义这样的内联函数
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()))