web-dev-qa-db-fra.com

Échec du test d'intention Espresso

J'apprends Android test d'instrumentation avec expresso. J'ai une application qui a un menu de tiroir et il y a un menu appelé À propos. Je testais cliquez sur cet élément de menu et le contenu de l'activité.

fonction de test:

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

maintenant la dernière vue de texte a un lien Web intégré. Ainsi, lorsque vous cliquez dessus, il ouvre le lien (www.support.com) dans une vue Web de l'application. Je veux tester cette fonctionnalité. j'ai donc essayé ceci:

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

mais le test échoue avec cette trace d'erreur:

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)

J'ai également essayé de résoudre en faisant tourner les ressources au ralenti avant de vérifier l'intention. Mais ça n'a pas marché. Quelqu'un peut-il aider?

27
HirenPatel_

J'ai eu le même problème et l'ai résolu en utilisant IntentsTestRule au lieu de ActivityTestRule. IntentsTestRule est une sous-classe de ActivityTestRule. Configurez votre @Rule qui crée l'activité comme ceci:

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

Voir le projet suivant pour plus d'informations: https://github.com/googlesamples/Android-testing/tree/master/ui/espresso/IntentsBasicSample

73
splatte

Si vous utilisez un ActivityTestRule personnalisé, vous pouvez ajouter les appels Intents.init(), Intents.release() appropriés:

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

@Override
protected void afterActivityFinished() {
    super.afterActivityFinished();
    Intents.release();
}
8
bonnyz

J'ai eu le même problème, cependant, le passage à IntentsTestRule n'a pas fonctionné non plus. Je reviens donc à ActivityTestRule et j'ai appelé Intents.init() avant et Intents.release() après le test qui a envoyé l'intention.

Pour plus d'informations, veuillez consulter ceci référence .

6
Petterson