5

Mi configuración:Comprobación de un proyecto que utiliza ActionBarSherlock

  1. proyecto de la Biblioteca: ActionBarSherlock
  2. Proyecto
  3. proyecto de prueba

Mi proyecto tiene el proyecto de biblioteca vinculado como un proyecto de biblioteca. Se compila y funciona bien.

Ahora trato de probar mi aplicación usando un proyecto de prueba normal. Ejecutar las pruebas en eclipse funciona perfecto. Si trato de ejecutar las pruebas utilizando hormiga, el proyecto de prueba ni siquiera compilar:

[javac] LoginActivityTest.java:9: cannot access com.actionbarsherlock.app.SherlockActivity 
[javac] class file for com.actionbarsherlock.app.SherlockActivity not found 
[javac] public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> { 
[javac]                  ^
[javac] LoginActivityTest.java:25: cannot find symbol 

edificio a través de Eclipse funciona perfecto y la prueba se ejecuta perfecto, también.

Si vinculo el proyecto de la biblioteca a mi proyecto de prueba, se compila con la hormiga pero las pruebas fallan.

[exec] Error in testSuiteConstructionFailed: 
[exec] java.lang.RuntimeException: Exception during suite construction 
[exec]  at android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests.testSuiteConstructionFailed(TestSuiteBuilder.java:238) 
[exec]  at java.lang.reflect.Method.invokeNative(Native Method) 
[exec]  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 
[exec]  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 
[exec]  at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:537) 
[exec]  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551) 
[exec] Caused by: java.lang.reflect.InvocationTargetException 
[exec]  at java.lang.reflect.Constructor.constructNative(Native Method) 
[exec]  at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
[exec]  at android.test.suitebuilder.TestMethod.instantiateTest(TestMethod.java:87) 
[exec]  at android.test.suitebuilder.TestMethod.createTest(TestMethod.java:73) 
[exec]  at android.test.suitebuilder.TestSuiteBuilder.addTest(TestSuiteBuilder.java:262) 
[exec]  at android.test.suitebuilder.TestSuiteBuilder.build(TestSuiteBuilder.java:184) 
[exec]  at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:371) 
[exec]  at com.zutubi.android.junitreport.JUnitReportTestRunner.onCreate(JUnitReportTestRunner.java:90) 
[exec]  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3891) 
[exec]  at android.app.ActivityThread.access$1300(ActivityThread.java:122) 
[exec]  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1184) 
[exec]  at android.os.Handler.dispatchMessage(Handler.java:99) 
[exec]  at android.os.Looper.loop(Looper.java:137) 
[exec]  at android.app.ActivityThread.main(ActivityThread.java:4340) 
[exec]  at java.lang.reflect.Method.invokeNative(Native Method) 
[exec]  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
[exec]  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
[exec]  at dalvik.system.NativeStart.main(Native Method) 
[exec] Caused by: java.lang.NoClassDefFoundError: com.myproject.android.app.activities.LoginActivity 
[exec]  at com.myproject.android.app.test.LoginActivityTest.<init>(LoginActivityTest.java:18) 
[exec]  ... 19 more 

Mi clase de prueba:

public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> { 

    private LoginActivity mActivity; 

    private EditText  mTextUserName; 

    private EditText  mTextUserPassword; 

    public LoginActivityTest() { 
     // the super call is line 18 (see stack trace above) 
     super("com.myproject.android.app.activities", LoginActivity.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
     mActivity = getActivity(); 
     mTextUserName = (EditText) mActivity.findViewById(com.myproject.android.app.R.id.login_activity_username); 
     mTextUserPassword = (EditText) mActivity.findViewById(com.myproject.android.app.R.id.login_activity_password); 
    } 

    public void testPreConditions() { 
     assertTrue("Activity is null!", mActivity != null); 
    } 

    public void testLogin() throws Throwable { 
     mActivity.runOnUiThread(new Runnable() { 
      public void run() { 
       mTextUserName.setText("username"); 
       mTextUserPassword.setText("password"); 
      } 
     }); 
     sendKeys(KeyEvent.KEYCODE_ENTER); 
    } 
} 

Algunas ideas de cómo puedo solucionar este problema?

Actualización: parece que la construcción/prueba de la hormiga sigue siendo un desastre. De acuerdo con esta entrada del blog sobre testing a library project, la mayoría de los 7 problemas mencionados se solucionarán en la próxima versión de ADT (ADT r20).

Respuesta

7

Hay muchos bits de información diferentes sobre el uso de proyectos Library desde que ADT 17 rompió/arregló todo (dependiendo de si está golpeando su cabeza contra su escritorio).

En primer lugar, tenga en cuenta la diferencia entre Library y "biblioteca" donde Library es un nombre decretado por el equipo de Android. También estoy usando el proyecto Referencing que describe un proyecto que usa un proyecto Library.

es decir, un proyecto Referencing utiliza un proyecto Library.

no Library Proyectos "biblioteca"

en el desarrollo normal de Java que es posible vincular los proyectos en Eclipse donde uno es dependiente de la fuente de la otra. Creo que este enfoque tiene el efecto de utilizar la (s) fuente (s) de proyectos de biblioteca como fuente para el proyecto de referencia. Esto significa que la fuente de los proyectos de la biblioteca está dentro del alcance al compilar el proyecto de referencia. Las clases de proyecto de biblioteca se crean al mismo tiempo que las del proyecto de referencia.

Al construir para su uso en la mayoría de las situaciones, esto funciona perfectamente bien ya que todas las clases se crean y luego se empaquetan en JAR o WAR o lo que sea.

proyectos de bibliotecas

A (no una mezcla y combinación) enfoque de la competencia a los proyectos de bibliotecas son los equipos Android Library proyectos:

proyecto

un androide marcado como un proyecto Library recopilará y compilar sus fuentes en un archivo jar en su directorio bin (después de un comando de limpieza/compilación). Cualquier proyecto Referencing automáticamente importa este jar y obtiene acceso a la funcionalidad de proyectos Library. Puede ver esta relación mirando dentro de la Biblioteca Java Android Dependencies en el Explorador de paquetes.

Junto a la resolución de dependencias del recurso de clase también se están directamente referenciado y se compila en R.java archivos dentro del directorio Referencing proyectos gen.

Los nuevos ADT problema introducido a los pueblos establecieron de porque añadió "apoyo" para la inclusión de los frascos que fueron referenciados por el proyecto Library:

Pre ADT 17

El proyecto Library tenía una jar agregado a su ruta de compilación. El proyecto Referencing también podría tener el jar agregado a su propia ruta de compilación.

ADT 17 en adelante

Dealing With Dependencies

Después de ADT 17 Library proyectos que hace referencia dinámicamente sus propios frascos comenzaron a comportarse de forma extraña. No se trata simplemente de incluir la misma referencia dependiente en su proyecto Referencing para mantener el archivo visible en ambos ámbitos. Esto ahora resultó en una extraña duplicación de clases incluidas.

Desafortunadamente, simplemente eliminando la biblioteca del proyecto Referencing o Library (por lo que solo había un enlace presente) y luego confundió eclipse, ya no podía ver el contenedor desde el alcance del Proyecto que lo usaba.

Para arreglar esto necesita colocar los jar Library proyectos en el directorio /libs - esto puede ser un problema en la parte trasera si los frascos están en lugares dispersos en su disco duro. Estos frascos se usarán automáticamente en sus proyectos Library y Referencing.

lo tanto, para moverse más allá de ADT 17:

  • Retire todos los archivos jar no siendo utilizado como una fuente en el ámbito de proyectos actual (ya sea su proyecto o LibraryReferencing).
  • Elimine ningún proyecto de "biblioteca" de su proyecto Library (en su lugar, compílelos en frascos).
  • Elimine los archivos jar externos de su proyecto Library, cópielos en su lugar al directorio libs.
Cuestiones relacionadas