【问题标题】:Espresso unable to resolve activity for intent - Unit testing abstract base activityEspresso 无法解析活动的意图 - 单元测试抽象基础活动
【发布时间】:2019-01-06 03:50:43
【问题描述】:

我是 Espresso 的新手,我正在尝试在 android 的抽象活动类中测试一种行为。

根据我的阅读,最好的方法是在测试文件中创建一个扩展基类的类,并实现执行超类行为所需的任何方法。

我已经这样做了,但是当我尝试运行它时,我收到以下错误:

(仅显示相关的堆栈跟踪行以及一些私人信息redacted

Caused by: java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN flg=0x14000000 cmp=com.redacted.redacted/.viewcontrollers.onboarding.BaseOnboardingActivityTest$SinglePageTestOnboarder }

一些问题似乎表明这是因为缺少 Activity 的清单条目,但它似乎是一种旧的做事方式并且不再需要,尽管我可能误解了一些事情。

我该如何解决这个问题?我不希望 Activity 成为实际应用程序的一部分,因为它仅可用于测试。

这里是测试类代码:

@RunWith(AndroidJUnit4::class)
class BaseOnboardingActivityTest {

    @Rule @JvmField
    var onboarderActivityTestRule = ActivityTestRule<SinglePageTestOnboarder>(SinglePageTestOnboarder::class.java)

    @Test
    fun testPageNumberDotsDoNotAppearWhenOnlyOnePage() {
        val testActivity = onboarderActivityTestRule.activity

        testActivity.pagesForOnboarding = getOnboardingTestPages(1)
        testActivity.displayPages()
        onView(withId(R.id.indicator_circle)).check(doesNotExist())

        testActivity.pagesForOnboarding = getOnboardingTestPages(2)
        testActivity.displayPages()
        onView(withId(R.id.indicator_circle)).check(matches(isDisplayed()))
    }

    class SinglePageTestOnboarder : BaseOnboardingActivity() {

        lateinit var pagesForOnboarding: List<OnboarderPageData>

        fun displayPages() {
            super.showOnboardingPages(pagesForOnboarding, "test")
        }

    }

    private fun getOnboardingTestPages(numPages: Int): List<OnboarderPageData> {
        val pages = arrayListOf<OnboarderPageData>()
        for (i in 0..numPages) {
            pages.add(OnboarderPageData())
        }
        return pages
    }

}

(我浏览过类似的问题并进行了大量搜索,但我认为我的问题与这些问题有些不同)

编辑:根据请求,完整的堆栈跟踪如下:

java.lang.RuntimeException: Could not launch activity
at android.support.test.runner.MonitoringInstrumentation.startActivitySync(MonitoringInstrumentation.java:460)
at android.support.test.rule.ActivityTestRule.launchActivity(ActivityTestRule.java:354)
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:525)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at android.support.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:101)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:384)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2136)
Caused by: java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN flg=0x14000000 cmp=com.redacted.redacted/.viewcontrollers.onboarding.BaseOnboardingActivityTest$SinglePageTestOnboarder }
at android.app.Instrumentation.startActivitySync(Instrumentation.java:472)
at android.app.Instrumentation.startActivitySync(Instrumentation.java:435)
at android.support.test.runner.MonitoringInstrumentation.access$101(MonitoringInstrumentation.java:96)
at android.support.test.runner.MonitoringInstrumentation$4.call(MonitoringInstrumentation.java:436)
at android.support.test.runner.MonitoringInstrumentation$4.call(MonitoringInstrumentation.java:433)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)

【问题讨论】:

  • "仅显示相关的堆栈跟踪行" -- 以后请发布整个堆栈跟踪。您不知道哪些台词可能与试图回答问题的人相关。
  • 你确定不需要各种冒泡线?

标签: android unit-testing android-activity kotlin android-espresso


【解决方案1】:

在我的例子中,我使用的是 AndroidAnnotations。当使用 @EActivity 时,会生成另一个类。所以我应该使用 Activity +“_”。

【讨论】:

    【解决方案2】:

    一些问题似乎表明这是因为缺少 Activity 的清单条目

    这绝对是导致该特定错误的原因。 ActivityTestRule 无法启动未出现在清单中的活动。

    我该如何解决这个问题?

    将活动添加到清单的androidTest 版本。这将允许它用于测试,但它不会成为您实际应用程序本身的一部分。

    这似乎不起作用。鉴于您的症状,我的猜测是要测试的活动需要在被测试的 APK 中,而不是在包含您的测试代码的 APK 中。

    知道的工作是让活动驻留在debug/ 源集中,因为我曾多次这样做。

    因此,作为mainandroidTest 的对等体,添加debug 源集。在那里,有一个带有 SinglePageTestOnboarder 活动的 java/ 树。将 androidTest 清单移动到 debug 源集,并将其调整为具有正确的 android:name 值。

    这确实意味着您的“测试”活动将在应用程序本身中,但仅适用于 debug 构建。大概你没有发布这样的构建; release 构建不包括 debug 源集中的内容。如果你甚至不想在debug 中使用这个类,你可以创建a separate build type,尽管这会使运行测试变得更加痛苦。

    【讨论】:

    • 嗯?有单独的清单版本吗?你能详细说明一下吗?我当然不想将它包含在整个应用程序的主 android 清单中,因为生产代码应该不知道测试代码的存在。
    • @Airhead:“有单独的清单版本吗?” -- 你可以在任何源集中有一个清单。因此,就像您拥有app/src/main/AndroidManifest.xml 一样,您也可以拥有app/src/androidTest/AndroidManifest.xml(对于名为app 的模块)。运行测试时,androidTest/AndroidManifest.xml 的内容将与main/AndroidManifest.xml 文件的内容合并。否则androidTest/AndroidManifest.xml 的内容将被忽略。
    • @Airhead:注意androidTest/AndroidManifest.xml 不需要复制main/AndroidManifest.xml 中的所有内容。 main 材质将是 mergedandroidTest 材质。您需要足够的元素脚手架才能到达正确的位置,但您的 androidTest 清单可以有 &lt;manifest&gt;&lt;application&gt;&lt;activity android:name=".viewcontrollers.onboarding.BaseOnboardingActivityTest$SinglePageTestOnboarder" /&gt;&lt;/application&gt;&lt;/manifest&gt; 和其他东西。
    • 好的,我已经这样做了,但我仍然遇到同样的错误。
    • 我相信它与包命名有关?在新清单中,我声明了 android:name="com.redacted.redacted.viewcontrollers.onboarding.BaseOnboardingActivityTest$SinglePageTestOnboarder"/>,但清单本身的包名称为 com.redacted.redacted.test - 我猜可能两者之间没有正确解决?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多