tutorial examples example español android eclipse junit android-maven-plugin

android - examples - junit tutorial



¿Prueba JUnit de Android no API simple en Eclipse con android-maven-plugin? (3)

Una prueba junit de Android debe ubicarse en un módulo separado como configuración en los proyectos de ejemplos de Android Maven Plugin (por ejemplo, el ejemplo morseflash). Esto se debe a la configuración de ruta sobrecargada y la necesidad de compilar el apk y desplegarlo en el dispositivo / emulador para ejecutar la prueba. Las pruebas junit de Android NO son pruebas unitarias, sino una prueba de integración (o en este caso se llaman pruebas de instrumentación).

Ejecuto pruebas JUnit que no son de Android desde Eclipse todos los días. Hoy quería probar algunas de mis clases de biblioteca de Android. Oh, el dolor.

Tengo un proyecto de biblioteca de Android usando android-maven-plugin. Tengo archivos fuente en src/main/java y mi (nueva) unidad de prueba en src/test/java . Mi POM tiene las dependencias de JUnit apropiadas y las referencias de android-maven-plugin.

A veces creo una instancia de Uri Android desde un File . A veces tengo una instancia de URI Java existente que he creado a partir de un File que luego convierto a URI . Como no confío ni en Java ni en Android con archivos y URI (no me explico cómo Java altera las rutas UNC en URI, o cómo Java rompe el contrato equals() en URI), quería crear una prueba de unidad simple para crear un archivo temporal, crea Uris desde dos enfoques diferentes y asegúrate de que salga igual.

Así que hago una pequeña prueba de la unidad JUnit como estoy acostumbrado, y trato de ejecutarlo en Eclipse usando Ctrl+F11 . Eclipse me pregunta si esto es una "Prueba JUnit de Android" o una "Prueba JUnit". Bueno, Android, obviamente. Así que elijo la primera opción y obtengo:

[2013-03-23 21:37:10 - mylib] ------------------------------ [2013-03-23 21:37:10 - mylib] Android Launch! [2013-03-23 21:37:10 - mylib] adb is running normally. [2013-03-23 21:37:10 - mylib] Could not find mylib.apk!

Hmmm ... eso no fue muy exitoso. Así que elimino la configuración de ejecución y pruebo solo "JUnit Test". Ahora obtengo un diálogo diferente, pidiéndome que seleccione mi iniciador preferido, ya sea "Android JUnit Test Launcher" o "Eclipse JUnit Test Launcher". No importa cuál elijo; Yo obtengo:

Class not found com.example.MyUnitTest java.lang.ClassNotFoundException: com.example.MyUnitTest at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClass(RemoteTestRunner.java:693) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClasses(RemoteTestRunner.java:429) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

He leído que con android-maven-plugin puedo ejecutar pruebas unitarias localmente en Eclipse si solo usan clases en el contenedor Android pero no hacen ninguna llamada API, que es lo que estoy haciendo aquí. Entonces, ¿cómo lo logro?


Una solución es hacer clic en el botón "Ejecutar como ..." en la barra de herramientas y luego seleccionar "Ejecutar configuraciones ...". Si selecciona el iniciador de JUnit que creó y va a su pestaña "Classpath", puede agregar la carpeta bin/classes a la ruta de acceso de bin/classes JUnit launcher. Esto debería ahora correr.


No utilice Run As - Android JUnit Test ya que solo ejecuta Android Test Project .

Cuando se usa Run As - JUnit Test , la ClassNotFoundException se debe a la inconsistencia entre ADT y Eclipse JUnit Test Runner incorporado a la carpeta de salida del proyecto. ADT genera todos los archivos .class en bin/classes , mientras que JUnit Test Runner incorporado busca archivos .class en target/classes . Su proyecto de Android en Eclipse nunca usa target/classes por lo que permanece vacío, esta es la razón por la cual obtiene la excepción ClassNotFoundException .

AFAIK no hay forma de alterar el JUnit Test Runner integrado de Eclipse para usar una carpeta diferente a las clases / destino predeterminadas. Vea la respuesta de Ricardo para ver cómo agregar bin/classes a la ruta de bin/classes de JUnit Test Runner incorporada. También tenga en cuenta que no puede alterar la carpeta de salida predeterminada de su proyecto Android a otra cosa que ../bin/classes sea ../bin/classes , ya que romperá el proceso de compilación de ADT.

La solución sucia (para resolver ClassNotFoundException) es copiar manualmente todo en bin/classes para target/classes , tenga en cuenta que debe hacer esto cada vez que cambie el código fuente.

Esto no es un problema cuando se ejecuta la mvn test desde la línea de comandos o mediante Eclipse, ya que Maven usa target/classes y sabe cómo llenarlo correctamente. tenga en cuenta que al usar este enfoque, no podrá usar la ventana JUnit con una agradable barra de error roja / verde dentro de Eclipse.