android - 应用程序选择器 - Android Espresso 单元测试在打开外部 URL 后中断

标签 android unit-testing android-espresso spoon

我有一个带有登录屏幕的 Android 应用程序,其中还包含一个忘记密码按钮,可将您带到网站以获得进一步帮助。我正在使用 Spoon 和 Espresso 对其进行测试,并使用以下简单的测试函数:

@Test
public void testForgotPassword()
{
    onView(withId(R.id.login_forgot_password)).perform(click());

    intended(allOf(
            hasAction(Intent.ACTION_VIEW),
            hasData(BuildConfig.FORGOT_PW_URL)));
}

此测试顺利通过,并在屏幕上显示“使用浏览器/chrome 对话框完成操作”,这是此设备的正确行为。到目前为止一切都很好。 但是,只要该对话框保留在那里,任何后续测试都无法打开应用程序,在长时间暂停后返回异常并导致测试失败。

我如何更新测试以主动摆脱对话框,或以其他方式确保我可以继续我的单元测试的其余部分?

完整异常供您引用:

2016-04-21 17:37:04 [STRL.testFailed] failed java.lang.RuntimeException: Could not launch intent Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=nl.test.example/.ui.activity.login.LoginActivity_ } within 45 seconds. Perhaps the main thread has not gone idle within a reasonable amount of time? There could be an animation or something constantly repainting the screen. Or the activity is doing network calls on creation? See the threaddump logs. For your reference the last time the event queue was idle before your activity launch request was 1461252979050 and now the last time the queue went idle was: 1461252979050. If these numbers are the same your activity might be hogging the event queue.
  at android.support.test.runner.MonitoringInstrumentation.startActivitySync(MonitoringInstrumentation.java:360)
  at android.support.test.rule.ActivityTestRule.launchActivity(ActivityTestRule.java:219)
  at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:268)
  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 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:59)
  at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262)
  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1667)

最佳答案

您必须对所有外部 Intent 进行 stub 才能继续您的测试用例。将这段安静的代码放入您的测试类中:

@Before
public void stubAllExternalIntents() {
    // By default Espresso Intents does not stub any Intents. Stubbing needs to be setup before
    // every test run. In this case all external Intents will be blocked.
    intending(not(isInternal())).respondWith(new ActivityResult(Activity.RESULT_OK, null));
}

更多信息 - IntentsBasicSample .

关于android - 应用程序选择器 - Android Espresso 单元测试在打开外部 URL 后中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36774586/

相关文章:

android - 从 Android 应用程序访问公共(public) Google Drive 文件夹而不进行身份验证

android - Android 中带有标题的边框?

C# 单元测试解析器

python - 模拟补丁多个

android - Espresso 在某些测试中随机卡住

android - 如何使用 Espresso 测试 fragment 是否可见

android - SMSManager 不适用于三星 Galaxy S3 LTE

java - 为什么有时在 Maven 中测试期间 public static AtomicBoolean 变量为 false?

Android Studio : Ambiguous Method Call

android - 应用程序未在 2.1 市场中显示