android - para - curso de cafe espresso
Falló la prueba de intento de café expreso (3)
Estoy aprendiendo pruebas de instrumentación android con espresso. Tengo una aplicación que tiene un menú de herramientas y hay un menú llamado Acerca de. Estuve probando, haga clic en ese elemento del menú y en los contenidos de la actividad.
función de prueba:
@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());
}
ahora la última vista de texto tiene insertado un enlace web. por lo tanto, cuando hace clic en él, abre el enlace (www.support.com) en una vista web en la aplicación. Quiero probar esta fumctionality. así que probé esto:
intended(hasComponent(WebViewActivity.class.getName())); //check if webview called on supportEmail link click
pero la prueba falla con este rastro de error:
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)
También he intentado resolver al ralentí los recursos antes de verificar la intención. Pero no funcionó. ¿Alguien puede ayudar?
Si está utilizando una ActivityTestRule
personalizada, puede agregar las Intents.init(), Intents.release()
adecuadas Intents.init(), Intents.release()
:
@Override
protected void afterActivityLaunched() {
Intents.init();
super.afterActivityLaunched();
}
@Override
protected void afterActivityFinished() {
super.afterActivityFinished();
Intents.release();
}
Tuve el mismo problema y lo resolví usando IntentsTestRule
lugar de ActivityTestRule
. IntentsTestRule
es una subclase de ActivityTestRule
. Configura tu @Rule
que crea la actividad de la siguiente manera:
@Rule
public IntentsTestRule<MyActivity> mActivity = new IntentsTestRule<MyActivity>(MyActivity.class) {
@Override
protected Intent getActivityIntent() {
...
}
};
Use IntentsTestRule en lugar de ActivityTestRule cuando use Espresso-Intents. https://google.github.io/android-testing-support-library/docs/espresso/intents/index.html
Tuve el mismo problema, sin embargo, cambiar a IntentsTestRule
tampoco funcionó. Así que vuelvo a ActivityTestRule
y llamo a Intents.init()
before e Intents.release()
después de la prueba que envió el Intent.
Para obtener más información, consulte esta reference .