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