2016-06-16 7 views
20

Ich lerne Android Instrumentierung testen mit Espresso. Ich habe eine App, die ein Schubladenmenü hat und es gibt ein Menü namens Über. Ich habe getestet, klicken Sie auf diesen Menüpunkt und den Inhalt der Aktivität.Espresso Intent Test fehlgeschlagen

Testfunktion:

@Test 
public void testNavigationDrawerAboutMenu() { 
    onView(withId(R.id.drawer_layout)) 
      .perform(DrawerActions.open()); //open drawer 
    onView(withText("About")).perform(click()); 
    onView(withId(R.id.aboutsptemail)).check(matches(withText(R.string.screen_about_support_email))); 
    onView(withId(R.id.aboutcpright)).check(matches(isDisplayed())); 
    onView(withId(R.id.aboutprivacy)).check(matches(isDisplayed())); 
    onView(withId(R.id.abouttermsconditions)).check(matches(isDisplayed())); 
    onView(withId(R.id.aboutsptemail)).perform(click()); 
} 

jetzt die letzte Textview hat Weblink darin eingebettet. Wenn Sie also darauf klicken, öffnet sich der Link (www.support.com) in einer Webansicht in App selbst. Ich möchte diese Funktionalität testen. so habe ich versucht, dies:

intended(hasComponent(WebViewActivity.class.getName())); //check if webview called on supportEmail link click 

aber Test nicht mit dieser Fehler-Trace:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.test.espresso.intent.OngoingStubbing android.support.test.espresso.intent.Intents.internalIntending(org.hamcrest.Matcher)' on a null object reference 
at android.support.test.espresso.intent.Intents.intending(Intents.java:155) 
at com.ScanBuy.SmartLabel.NavigationDrawerActivityTests.testNavigationDrawerAboutMenu(NavigationDrawerActivityTests.java:94) 
at java.lang.reflect.Method.invoke(Native Method) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at android.support.test.internal.statement.UiThreadStatement.evaluate(UiThreadStatement.java:55) 
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:270) 
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.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:1879) 

ich auch lösen, indem die Ressourcen im Leerlauf vor der Prüfung für Vorsatz versucht habe. Aber hat nicht funktioniert. Kann jemand helfen?

Antwort

53

Ich hatte das gleiche Problem und löste es mit IntentsTestRule anstelle von ActivityTestRule. IntentsTestRule ist eine Unterklasse von ActivityTestRule. Richten Sie Ihre @Rule, die die Aktivität erzeugt etwa so:

@Rule 
public IntentsTestRule<MyActivity> mActivity = new IntentsTestRule<MyActivity>(MyActivity.class) { 
    @Override 
    protected Intent getActivityIntent() { 
     ... 
    } 
}; 

Verwenden IntentsTestRule statt ActivityTestRule wenn Espresso-Intents verwendet wird. https://google.github.io/android-testing-support-library/docs/espresso/intents/index.html

+0

ya. Perfekt. Vielen Dank. –

3

Wenn Sie eine benutzerdefinierte ActivityTestRule verwenden, können Sie die richtigen Intents.init(), Intents.release() Anrufe hinzu:

@Override 
protected void afterActivityLaunched() { 
    Intents.init(); 
    super.afterActivityLaunched(); 
} 

@Override 
protected void afterActivityFinished() { 
    super.afterActivityFinished(); 
    Intents.release(); 
} 
+0

Ist dies der Verwendung von ** IntentsTestRule ** vorzuziehen? –

+1

Es ist eigentlich das Gleiche. Wenn Sie bereits eine benutzerdefinierte ActivityTestRule haben oder diese Funktion dynamisch aktivieren möchten, ist es sinnvoll, diesen Ansatz zu verwenden, andernfalls verwenden Sie einfach IntentsTestRule. – bonnyz

0

ich hatte das gleiche Problem, aber funktioniert hat zu IntentsTestRule Schalten nicht auch. Also wechsle ich zurück zu ActivityTestRule und rufe Intents.init() vor und Intents.release() nach dem Test, der die Absicht gesendet hat.

Weitere Informationen finden Sie unter reference.

Verwandte Themen