java - ¿Por qué JUnit 4 en Android no funciona?
junit4 dalvik (2)
Una explicación (en japonés) está aquí:
http://d.hatena.ne.jp/esmasui/20120910/1347299594
Deduzco que el problema surge de la implementación de InstrumentationTestRunner
.
La solución del autor es el proyecto AndroidJUnit4 .
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 ). Debería quedar claro que JUnit 4 no se puede usar de forma inmediata con Android.
Pero ¿por qué es este el caso? ¿Es porque las pruebas se ejecutan dentro del DVM (en que Android Runtime solo 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 usarse. ¿No es esto posible dentro del DVM?
Actualización 2015/10
Ahora es posible a través de AndroidJUnitRunner, que es parte de la Biblioteca de soporte de pruebas de Android . En resumen, debe hacer lo siguiente en un proyecto basado en Gradle:
Agrega las dependencias:
dependencies { compile ''com.android.support:support-annotations:22.2.0'' androidTestCompile ''com.android.support.test:runner:0.4.1'' }
Especifique el testInstrumentationRunner:
android { defaultConfig { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } }
Anota tu clase de prueba con
@RunWith(AndroidJUnit4.class)
.- Escriba sus pruebas en el estilo JUnit4 normal.
También vea las instrucciones de configuración de Espresso . Tenga en cuenta que no necesita Espresso en sí para las pruebas simples de JUnit4.
Por qué es necesario
Hay muy poca información que pude encontrar en internet sobre este tema. Lo mejor que encontré fue la información sobre 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 prueba de Android hace un trabajo adicional:
- Envía resultados de prueba a su máquina de desarrollo por ADB.
- Hace instrumentación (no estoy seguro de qué es exactamente esto).
Lo anterior es realizado por algunas extensiones específicamente para JUnit3.
Este código JUnit3 específico parece ser parte de InstrumentationTestRunner, que forma parte del núcleo del sistema Android. Sin embargo, como es evidente con AndroidJUnitRunner, es posible utilizar un corredor de prueba personalizado que admita JUnit4 u otros marcos.