¿Por qué JUnit 4 en Android no funciona?

Como dice la documentación de Android: "Tenga en cuenta que la API de prueba de Android admite el estilo de código JUnit 3, pero no JUnit 4." ( Fundamentos de Prueba ). Debe estar claro que JUnit 4 no se puede usar fuera de la caja con Android.

¿Pero por qué es este el caso? ¿Es porque las pruebas se ejecutan dentro de la DVM (en que el Android Runtime sólo tiene soporte para JUnit 3)? En una JVM uno por sí solo podría elegir el tiempo de ejecución de JUnit que debería utilizarse. ¿No es esto posible dentro del DVM?

Actualización 2015/10

Ahora es posible a través de AndroidJUnitRunner, que forma parte de la Biblioteca de soporte de pruebas de Android . En resumen, debe realizar lo siguiente en un proyecto basado en Gradle:

  1. Agregue las dependencias:

    dependencies { compile 'com.android.support:support-annotations:22.2.0' androidTestCompile 'com.android.support.test:runner:0.4.1' } 
  2. Especifique el testInstrumentationRunner:

     android { defaultConfig { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } } 
  3. @RunWith(AndroidJUnit4.class) clase de prueba con @RunWith(AndroidJUnit4.class) .

  4. Escriba sus pruebas en el estilo normal de JUnit4.

Consulte también las instrucciones de configuración de Espresso . Tenga en cuenta que no necesita el propio Espresso para las pruebas simples de JUnit4.

Por qué es necesario

Hay muy poca información que podría encontrar en Internet en este tema. Lo mejor que encontré fue la información de InstrumentationTestRunner .

No hay nada que impida que las pruebas JUnit4 se ejecuten en un dispositivo Android como cualquier otro código Java. Sin embargo, el marco de pruebas de Android realiza un trabajo adicional:

  1. Envía los resultados de la prueba a su máquina de desarrollo a través de ADB.
  2. Hace instrumentación (no estoy seguro de qué es exactamente esto implica).

Lo anterior es realizado por algunas extensiones específicamente para JUnit3.

Este código específico de JUnit3 parece formar parte del InstrumentationTestRunner que forma parte del sistema principal de Android. Sin embargo, como es evidente con AndroidJUnitRunner, es posible utilizar un corredor de prueba personalizado que soporte JUnit4 u otros frameworks.

Una explicación (en japonés) está aquí:

http://d.hatena.ne.jp/esmasui/20120910/1347299594

Me parece que el problema surge de la implementación de InstrumentationTestRunner .

La solución del autor es el proyecto AndroidJUnit4 .

  • AndroidJUnit4.class + org.junit.Assume.assumeTrue = AssumptionViolatedException
  • Cómo configurar Robolectric en Android Studio 1.0
  • Necesita ayuda para escribir una prueba de unidad usando Mockito y JUnit4
  • ¿Hay una manera de ejecutar la prueba de Espresso con múltiples métodos de prueba pero sólo un método de configuración?
  • Ejecución de pruebas Android método setUp () se llama varias veces
  • Prueba de clases sin actividad en Android
  • Prueba de Android JUnit4
  • Anotación @UiThreadTest produce "java.lang.Exception: No se pueden ejecutar métodos"
  • No se puede ejecutar JUnit 4 caso de prueba en el proyecto Eclipse Android
  • NullPointerException validando el correo electrónico
  • Espresso + Junit4 - iniciar sesión una vez antes de ejecutar todas las pruebas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.