2016-04-21 49 views
1

我有一个带有登录屏幕的Android应用程序,该应用程序还包含一个忘记密码按钮,可让您访问网站以获取进一步帮助。我使用勺子和咖啡测试它,用下面简单的测试功能:应用选择器 - Android Espresso在打开外部URL后打破单元测试

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

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

该测试通过罚款,并显示在屏幕上,这是正确的行为的“使用浏览器/铬对话框完成行动”为这个设备。迄今为止都很好。 但是,只要该对话框保留在那里,任何后续测试都无法打开该应用程序,并在长时间暂停并且未通过测试后返回异常。

如何更新测试以主动摆脱对话框,或者确保我可以继续进行剩余的单元测试?

,供大家参考完整例外:

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) 

回答

6

你必须存根所有外部意图能够与您的测试用例进行。把这个和平代码放在你的测试类中:

@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

+0

该代码段还打破了涉及应用程序内导航的所有其他测试用例。然而,由于指针我最终修改它使用意图(hasAction(Intent.ACTION_VIEW)),而不是我的工作。 – Combuster

+0

你是绝对的救星!,在这个例子中很深的jeez haha​​ –

+0

Thanks for this –

相关问题