¿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.

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) 

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); } 
  • Cómo pasar un argumento a una prueba junit de android (pruebas parametrizadas)
  • AndroidManifest en el directorio androidTest que se ignora
  • ¿Cómo puedo crear una suite de pruebas de Android que sólo ejecuta pruebas especificadas en una o más clases?
  • 'Private static final' miembro de la clase de prueba de unidad de Android cambia el valor a null
  • Unidad de prueba de un receptor de radiodifusión?
  • Android RxJava 2 Prueba JUnit - getMainLooper en android.os.Looper no se burla de RuntimeException
  • Prueba del código de Android con JUnit y el JDK
  • Unidad de prueba SparseArray utilizando JUnit (utilizando JVM)
  • Cómo probar interfaz de escucha se llama dentro de pruebas de unidad de Android
  • Cobertura de código Emma para la prueba de androide JUnit
  • "La prueba no se ejecutó hasta la finalización." Motivo: 'La instrumentación ejecutada falló debido a' El proceso se estrelló. '' Mientras se ejecutan varios testcases
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.