2016-06-16 21 views
20

Uczę się testowania oprzyrządowania Android z espresso. Mam aplikację, która ma drawermenu i tam jest menu o nazwie About. Testowałem kliknięcie tego elementu menu i zawartości aktywności.Test intencji espresso nie udaje się

testfunction:

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

teraz ostatni TextView ma odsyłaczy osadzone w nim. więc po kliknięciu na nią otwiera link (www.support.com) w widoku sieci w samej aplikacji. Chcę przetestować tę fumucję. więc próbowałem to:

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

ale test nie powiedzie się z tego śladu błędu:

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) 

Próbowałem również w drodze na biegu jałowym zasobów przed sprawdzeniem intencji. Ale nie działa. Czy ktokolwiek może pomóc?

Odpowiedz

53

Miałem ten sam problem i rozwiązałem go, używając IntentsTestRule zamiast ActivityTestRule. IntentsTestRule jest podklasą ActivityTestRule. Skonfiguruj swoje @Rule która tworzy aktywności tak:

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

Zastosowanie IntentsTestRule zamiast ActivityTestRule przy użyciu espresso intencjami. https://google.github.io/android-testing-support-library/docs/espresso/intents/index.html

+0

ya. Idealny. Dzięki. –

3

Jeśli używasz niestandardowego ActivityTestRule, można dodać odpowiednie Intents.init(), Intents.release() połączeń:

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

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

Czy jest to lepsze niż użycie ** IntentsTestRule **? –

+1

To właściwie to samo. Jeśli masz już niestandardowy ActivityTestRule lub chcesz włączyć tę funkcję dinamicznie, sensowne jest użycie tego podejścia, w przeciwnym razie użyj tylko IntentsTestRule. – bonnyz

0

miałem ten sam problem, jednak przejście do IntentsTestRule nie działa, too. Wracam więc do ActivityTestRule i zadzwonię pod numer Intents.init() przed i Intents.release() po teście, który wysłał intencję.

Aby uzyskać więcej informacji, zobacz ten reference.

Powiązane problemy