我正在尝试使用Espresso为我的android应用程序创建UI测试。我的活动正在扩展AppCompatActivity
,并且我正在使用ActivityTestRule
来启动活动,但是它给出了以下异常:
Type parameter bound for T in constructor ActivityTestRule<T : Activity (activityClass: Class<T!>!)is not satisfied: inferred type HomeActivity! is not a subtype of Activity!
这是我的考试班:
@RunWith(AndroidJUnit4::class)
class ProductListRestrictionsUITest {
@Rule @JvmField
var activityRule = ActivityTestRule(HomeActivity::class.java)
@Test
fun buttonClick_goToSecondActivity() {
onView(withId(R.id.floatingSearchView)).perform(click())
onView(withId(R.id.floatingSearchView)).perform(typeText("olut"))
onView(withId(R.id.floatingSearchView)).perform(pressKey(KeyEvent.KEYCODE_SEARCH))
// onView(withId(R.id.layout)).check(matches(isDisplayed()))
}
}
我在gralde文件中也具有必需的依赖项:
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'
// espresso support
androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', {
exclude group: 'com.android.support', module: 'support-annotations'
})
我找不到任何资源说明AppCompatActivity
使用什么其他规则。我在这里做错了什么?
答案 0 :(得分:0)
当主应用程序和测试模块之间的appcompat版本不同时,这可能会在com.android.test
模块中发生。
修正是在app/build.gradle
和testmodule/build.gradle
中用版本号显式声明appcompat依赖项,以便在两者中获得相同的版本。
答案 1 :(得分:0)
两次读取错误消息时,尤其是错误消息的第一行和第二行:
Type parameter bound for T in constructor ActivityTestRule<T :
Activity (activityClass: Class<T!>!)is not satisfied:
inferred type HomeActivity! is not a subtype of Activity!
这暗示了明确告诉它,应该推断出哪种类型<T>
:
@Rule @JvmField
val activityRule: ActivityTestRule<HomeActivity> = ActivityTestRule(HomeActivity::class.java)
在Java
中,它需要相同的冗余语法,并且也不允许通用类型<T>
。
答案 2 :(得分:0)
这是在我为测试创建的单独模块上发生的。我有一个base-android
模块,它保存我的BaseActivity
,并且没有将其导入我的测试模块中。由于它看不到导入的基本活动,因此测试看不到其超级类型。在我的base-android
模块上导入tests
模块可以解决此问题。