Espresso ActivityTestRule不适用于AppCompatActivity

时间:2019-03-04 12:31:19

标签: android kotlin android-espresso android-instrumentation

我正在尝试使用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使用什么其他规则。我在这里做错了什么?

3 个答案:

答案 0 :(得分:0)

当主应用程序和测试模块之间的appcompat版本不同时,这可能会在com.android.test模块中发生。

修正是在app/build.gradletestmodule/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模块可以解决此问题。