2016-04-21 4 views
1

Ich habe eine Android App mit einem Login-Bildschirm, der auch eine Passwort vergessen Schaltfläche enthält, die Sie auf eine Website für weitere Unterstützung bringt. Ich teste es mit Löffeln und Espresso, mit der folgenden einfachen Testfunktion:Anwendung wähle - Android Espresso Unit Tests brechen nach dem Öffnen externer 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))); 
} 

Dieser Test geht in Ordnung, und zeigt die „Complete Aktion Browser/Chrom-Dialog“ auf dem Bildschirm, die das richtige Verhalten ist für dieses Gerät. Alles gut bis jetzt. Solange dieser Dialog jedoch dort verbleibt, kann bei jedem nachfolgenden Test die App nicht geöffnet werden. Nach einer langen Pause wird eine Ausnahme zurückgegeben und der Test nicht bestanden.

Wie kann ich den Test aktualisieren, um den Dialog aktiv loszuwerden, oder anderweitig sicherstellen, dass ich mit dem Rest meiner Komponententests fortfahren kann?

Die vollständige Ausnahme für Ihre Referenz:

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) 

Antwort

6

Sie haben alle externen Absichten Stummel mit Ihrem Testfälle in der Lage sein, um fortzufahren. Diesen Frieden von Code in der Testklasse:

@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)); 
} 

Mehr hier - IntentsBasicSample.

+0

Dieses Snippet brach auch jeden anderen Testfall, der die Navigation innerhalb der App beinhaltete. Aber dank des Zeigers habe ich es geändert, um stattdessen intending (hasAction (Intent.ACTION_VIEW)) zu verwenden, was für mich funktioniert. – Combuster

+0

Sie absolute Lebensretter !, Jeez das ist tief in den Beispielen haha ​​ –

+0

Danke dafür –