2016-06-16 4 views
20

Я изучаю аппаратное тестирование андроидов с эспрессо. У меня есть приложение, в котором есть drawermenu, и есть меню под названием About. Я тестировал этот пункт меню и содержимое активности.Тестовый тест эспрессо с ошибкой

функция тест:

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

теперь последний TextView имеет веб-ссылку поместить его в нем. поэтому, когда вы нажимаете на него, он открывает ссылку (www.support.com) в веб-браузере в приложении. Я хочу проверить эту футурмальность. поэтому я попытался это:

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

но тест не с этого следа ошибки:

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) 

Я также попытался решительность на холостом ходу ресурсов перед проверкой намерений. Но не получилось. Может ли кто-нибудь помочь?

ответ

53

У меня была такая же проблема, как у меня с этим вопросом была решена IntentsTestRule вместо ActivityTestRule. IntentsTestRule является подклассом ActivityTestRule. Настройте свой @Rule, которая создает деятельность таким образом:

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

Использование IntentsTestRule вместо ActivityTestRule при использовании Эспрессо-Intents. https://google.github.io/android-testing-support-library/docs/espresso/intents/index.html

+0

ya. Отлично. Благодарю. –

3

Если вы используете пользовательские ActivityTestRule, вы можете добавить соответствующие Intents.init(), Intents.release() вызовы:

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

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

Это предпочтительнее использовать ** IntentsTestRule **? –

+1

Это на самом деле то же самое. Если у вас уже есть пользовательский ActivityTestRule или вы хотите включить эту функцию динамически, имеет смысл использовать этот подход, иначе просто используйте IntentsTestRule. – bonnyz

0

У меня была такая же проблема, однако, переход на IntentsTestRule не работал, тоже. Поэтому я возвращаюсь к ActivityTestRule и звоню Intents.init() до и Intents.release() после теста, который отправил намерение.

Для получения дополнительной информации см. Это reference.

Смежные вопросы