¿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.
- Android jUnit Test java.lang.NoClassDefFoundError: android / base de datos / sqlite / SQLiteOpenHelper
- Unidad de prueba de un receptor de radiodifusión?
- Cómo ejecutar pruebas de unidad con Android Studio
- La compatibilidad con la prueba de unidades Android no funciona en los módulos de la biblioteca de Android
- Casos de prueba de Android que fallan después de actualizar a Java 8 y herramientas de compilación versión 25
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)
- Cómo probar interfaz de escucha se llama dentro de pruebas de unidad de Android
- Robolectric - cómo desactivar una prueba de unidad?
- ¿Es posible entrar en el modo de depuración para android cuando se ejecuta junit test?
- Cómo agregar dependencias testCompile a IDE classpath
- VerifyError con PowerMock en Android
- Agrupación de pruebas roboeléctricas utilizando junit Category en un proyecto gradle de Android
- Pruebas unitarias con Android Studio y Gradle?
- UnsatisfiedLinkError cuando la unidad de prueba WritableNativeMap
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?