¿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); } 
  • AndroidJUnit4 y pruebas parametrizadas
  • Mocking up WifiManager para la prueba de unidad Android
  • Cómo ejecutar pruebas en un fragmento de actividades
  • No golpear puntos de interrupción depurar pruebas de Junit de Android en Eclipse
  • Gradle JUnit Espresso en el emulador connectedAndroidTest java.lang.IncompatibleClassChangeError
  • Envío de mayúsculas a un TextEdit durante pruebas instrumentadas
  • RoboLectric y Android en Eclipse (ADVERTENCIA: no hay valor de propiedades del sistema para ro.build.date.utc)
  • Junit / Mockito - esperar la ejecución del método
  • Cómo ejecutar swipe con appium en Java para la aplicación nativa de Android
  • Automatización de la caja de prueba de la unidad Android: biblioteca Robolectric vs marco de pruebas de Android
  • Dos robotium caso de prueba, pero el segundo colgar no responde (en JUnit View)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.