android - Espresso 无法解析活动的意图 - 单元测试抽象基础活动
问题描述
我是 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 的清单条目,但似乎这是一种旧的做事方式并且不再需要,尽管我可能会误解一些事情。
我怎样才能解决这个问题?我不希望该活动成为实际应用程序的一部分,因为它仅可用于测试。
这是测试类代码:
@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)
解决方案
有些问题似乎表明这是因为缺少 Activity 的清单条目
这绝对是导致该特定错误的原因。ActivityTestRule
无法启动未出现在清单中的活动。
我怎样才能解决这个问题?
将活动添加到您androidTest
的清单版本。这将允许它用于测试,但它不会成为您实际应用程序本身的一部分。
这似乎不起作用。鉴于您的症状,我的猜测是要测试的活动需要在被测试的 APK 中,而不是在包含您的测试代码的 APK 中。
我所知道的工作是将活动驻留在debug/
源集中,因为我曾多次这样做。
因此,作为 and 的对等体main
,androidTest
添加一个debug
源集。在那里,有一java/
棵树有你的SinglePageTestOnboarder
活动。将androidTest
清单移动到debug
源集,并将其调整为适当的android:name
值。
这确实意味着您的“测试”活动将在应用程序本身中,但仅用于debug
构建。大概你没有发布这样的构建;release
构建不包括debug
源集中的内容。如果您甚至不想要这个类debug
,您可以创建一个单独的构建类型,尽管这会使运行测试更加痛苦。
推荐阅读
- c# - C# 删除第一个包装 div
- amazon-web-services - AWS ECS EC2 滚动更新 - 可用的 CPU 单元不足
- c# - SQL 数据库邮件 - 状态已发送但从未在 Microsoft 电子邮件中收到电子邮件
- c++ - 字符串化模板数字参数
- node.js - React / Express - 错误:ENOENT:没有这样的文件或目录,stat '/app/build/index.html'
- wordpress - 从无头 Wordpress 触发构建 Github Pages 站点
- django - 如何从查询集中只返回 id 号作为计数器?
- java - 将 spark 的数据框列转换为 json 对象
- xml - 基于命名字段值的 XPath
- javascript - SuiteScript 2.0 对话框按钮返回“true”不起作用