¿Es posible ejecutar pruebas de unidad de Android Espresso en métodos anotados @BeforeClass?
Tengo un problema al usar la anotación JUnit4 @BeforeClass
en la prueba de unidad con instrumentos de Android (estoy usando la librería de pruebas de la GUI de Espresso ). Tan pronto como añado una prueba con la anotación @BeforeClass
, Android Studio 1.5.1 no ejecuta ninguna prueba en absoluto, sino que simplemente imprime "Empty test suite". No estoy usando una suite de pruebas. Busqué este sitio y la web pero no pude encontrar una solución. Pensé que podría ser un problema que el código, que se llama dentro del método @BeforeClass
realmente falla (TDD), pero este error incluso se produce cuando el código, que está funcionando en casos normales de prueba, se pone en el método @BeforeClass
anotado .
Gracias.
- ¿Por qué Android utiliza JUnit sobre TestNG incluso si Cedric Beust creó TestNg y formó parte del equipo de Android?
- Android Gradle Unit Prueba de migración de JARs - duplicar los archivos hamcrest de junit y mockito
- Ejecución de pruebas simples de JUnit en Android Studio (IntelliJ) al utilizar una configuración basada en Gradle
- Prueba de Fragmentos de Android
- !!! JUnit versión 3.8 o posterior esperado
UPDATE: Después de comprobar la salida logcat, como sugirió un comentarista, parece que el problema es que el problema es que no se inició ninguna actividad : No se encontraron actividades. ¿ getActivity()
iniciar la actividad llamando a getActivity()
o startActivitySync
o similar?
¿Cómo debería hacer esto? No puedo utilizar el campo ActivityTestRule
, ya que el método anotado @BeforeClass
es estático.
Tal vez sólo estoy usando la anotación @BeforeClass
de una manera incorrecta. Mi impresión fue que puedes usar esta anotación para ejecutar pruebas antes de todas las otras pruebas en la clase de prueba. Básicamente estaba buscando un reemplazo para la anotación de TestNG "dependsOnMethods"
aquí. Tal vez sea mejor usar la @FixMethodOrder(MethodSorters.NAME_ASCENDING)
en la clase de prueba y renombrar el primer caso de prueba aaa_my_testcase
.
¿Podría alguien comentar sobre eso? Gracias.
Reformuló el título de la pregunta.
import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.MethodSorters; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.Espresso.pressBack; import static android.support.test.espresso.action.ViewActions.click; import static android.support.test.espresso.assertion.ViewAssertions.matches; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.isEnabled; import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription; import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withText; import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.not; @RunWith(AndroidJUnit4.class) public class MainActivityTest { @Rule public ActivityTestRule<MainActivity> menuActivityTestRule = new ActivityTestRule<>(MainActivity.class); private static void checkSignBrowserIsDisplayed() { onView(withText(R.string.sign_browser)).check(matches(isDisplayed())); } @BeforeClass public static void checkSignBrowserIsDisplayedOnAppStartup() { checkSignBrowserIsDisplayed(); }
build.app:
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "foo" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { debuggable true } } testOptions { unitTests.returnDefaultValues = true } } dependencies { testCompile 'org.mockito:mockito-core:1.10.19' testCompile 'junit:junit:4.12' androidTestCompile 'junit:junit:4.12' androidTestCompile 'com.android.support:support-annotations:23.1.1' androidTestCompile 'com.android.support.test:runner:0.4.1' androidTestCompile 'com.android.support.test:rules:0.4.1' androidTestCompile 'org.hamcrest:hamcrest-library:1.3' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1' // required if you want to use Mockito for Android instrumentation tests - not needed now. // androidTestCompile 'org.mockito:mockito-core:1.+' // androidTestCompile "com.google.dexmaker:dexmaker:1.2" // androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.2" compile fileTree(include: ['*.jar'], dir: 'libs') compile 'org.apache.commons:commons-lang3:3.4' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' }
Salida de prueba:
Ejecución de pruebas
Se ha iniciado la prueba
Conjunto de pruebas vacío.
Salida Logcat:
01-25 10:22:42.746 22098-22118/foo I/TestRunner: run started: 5 tests 01-25 10:22:42.764 22098-22118/foo D/InputManagerEventInjectionStrategy: Creating injection strategy with input manager. 01-25 10:22:42.890 22098-22118/foo I/TestRunner: failed: foo.MainActivityTest 01-25 10:22:42.890 22098-22118/foo I/TestRunner: ----- begin exception ----- 01-25 10:22:42.891 22098-22118/foo I/TestRunner: java.lang.RuntimeException: No activities found. Did you forget to launch the activity by calling getActivity() or startActivitySync or similar? at android.support.test.espresso.base.RootViewPicker.waitForAtLeastOneActivityToBeResumed(RootViewPicker.java:189) at android.support.test.espresso.base.RootViewPicker.findRoot(RootViewPicker.java:134) at android.support.test.espresso.base.RootViewPicker.get(RootViewPicker.java:80) at android.support.test.espresso.ViewInteractionModule.provideRootView(ViewInteractionModule.java:69) at android.support.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.java:23) at android.support.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.java:9) at android.support.test.espresso.base.ViewFinderImpl.getView(ViewFinderImpl.java:68) at android.support.test.espresso.ViewInteraction$2.run(ViewInteraction.java:166) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5312) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 01-25 10:22:42.891 22098-22118/foo I/TestRunner: ----- end exception ----- 01-25 10:22:42.891 22098-22118/foo I/TestRunner: failed: Test mechanism 01-25 10:22:42.892 22098-22118/foo I/TestRunner: ----- begin exception ----- 01-25 10:22:42.892 22098-22118/foo I/TestRunner: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Bundle.putString(java.lang.String, java.lang.String)' on a null object reference at android.support.test.internal.runner.listener.InstrumentationResultPrinter.reportFailure(InstrumentationResultPrinter.java:183) at android.support.test.internal.runner.listener.InstrumentationResultPrinter.testFailure(InstrumentationResultPrinter.java:173) at org.junit.runner.notification.SynchronizedRunListener.testFailure(SynchronizedRunListener.java:63) at org.junit.runner.notification.RunNotifier$4.notifyListener(RunNotifier.java:142) at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:72) at org.junit.runner.notification.RunNotifier.fireTestFailures(RunNotifier.java:138) at org.junit.runner.notification.RunNotifier.fireTestFailure(RunNotifier.java:132) at org.junit.internal.runners.model.EachTestNotifier.addFailure(EachTestNotifier.java:23) at org.junit.runners.ParentRunner.run(ParentRunner.java:369) 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:54) at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:240) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1928)
- Androide plain Junit con Daga 2
- Java.lang.NoClassDefFoundError mientras ejecuta la prueba JUnit en Netbeans
- NullPointerException en la reflexión durante el arranque de Robolectric - cualquier sugerencias?
- Acceso a recursos de R.raw en Android Instrumentation jUnit test
- Android + Robolectric - RuntimeException / InstantiationException en queryBuilder.query () en ContentProvider
- Envío de mayúsculas a un TextEdit durante pruebas instrumentadas
- ¿Por qué Log.d () no imprime nada al ejecutar la Prueba de unidad local de Android?
- Error en la instrumentación Android: error de aserción
Tuve el mismo problema y fue sólo debido a la regla, puede configurar la actividad para iniciar en el constructor de la regla:
@Rule public ActivityTestRule<MainActivity> menuActivityTestRule = new ActivityTestRule<>(MainActivity.class, true, true);
el último argumento es responsable del lanzamiento de la actividad.
Odio ver esta pregunta sin respuesta.
Por lo tanto, para todos los que podrían tropezar con esto:
Mi solución fue utilizar la @FixMethodOrder(MethodSorters.NAME_ASCENDING)
en la clase de prueba y cambiar el nombre del primer caso de prueba a aaa_my_testcase
.
Vea: MethodSorters , FixMethodOrder .
Yo estaba teniendo el mismo problema porque estaba probando fragmentos autónomos no una actividad, he creado FragmentTestRule
extendiendo ActivityTestRule
. Y tengo que llamar al método launchActivity()
en cada prueba.
@Test public void recyclerViewItemClickTest() { mFragmentTestRule.launchActivity(null); }
- Error de tema de diseño de material
- Android: ¿Hay alguna manera de obtener la capacidad de la batería de un dispositivo en mah?