2011-04-06 13 views
28

Tengo un problema al ejecutar las pruebas de la unidad de android contra las aplicaciones de Android que utilizan la API de compatibilidad de Fragment recientemente lanzada. Cuando la prueba se ejecuta contra una FragmentActivity, el siguiente error aparece en el registro y la clase no se carga. Cuando se ejecuta contra una clase idéntica, pero una derivada de la actividad, la prueba funciona bien. ¡Ambas clases funcionan correctamente como aplicaciones! Lo que significa que cuando se invoca simplemente ambos muestran su diseño y función correctamente. El contenedor de soporte es parte de la ruta de compilación e incluido en el proyecto.FragmentActivity no se puede probar a través de ActivityInstrumentationTestCase2

El problema que tengo es que la única forma de utilizar fragmentos (y es compatible con Android pre3.0) es utilizar FragmentActivity, pero si eso excluye las pruebas automatizadas, ¿de qué sirve esta biblioteca?

4-05 18:00:11.276: WARN/dalvikvm(1095): Class resolved by unexpected DEX: Lcom/example/android/app/FragmentLayoutSupport;(0x406351a0):0x12e5c8 ref [Landroid/support/v4/app/FragmentActivity;] Landroid/support/v4/app/FragmentActivity;(0x406351a0):0x12e440 
04-05 18:00:11.276: WARN/dalvikvm(1095): (Lcom/example/android/app/FragmentLayoutSupport; had used a different Landroid/support/v4/app/FragmentActivity; during pre-verification) 
04-05 18:00:11.286: WARN/dalvikvm(1095): Unable to resolve superclass of Lcom/example/android/app/FragmentLayoutSupport; (49) 
04-05 18:00:11.286: WARN/dalvikvm(1095): Link of class 'Lcom/example/android/app/FragmentLayoutSupport;' failed 
04-05 18:00:11.286: ERROR/dalvikvm(1095): Could not find class 'com.example.android.app.FragmentLayoutSupport', referenced from method com.example.android.app.test.FrameLayoutTest.<init> 
04-05 18:00:11.286: WARN/dalvikvm(1095): VFY: unable to resolve const-class 131 (Lcom/example/android/app/FragmentLayoutSupport;) in Lcom/example/android/app/test/FrameLayoutTest; 

Aquí está el código que construí para demostrar el problema. El caso de prueba, simplemente intenta crear una instancia de la clase bajo prueba:

FrameLayoutTest.java  
public class FrameLayoutTest extends 
      ActivityInstrumentationTestCase2<FragmentLayoutSupport> { 
     public FrameLayoutTest() { 
      super(FragmentLayoutSupport.class); 
     } 

    public void testActivityTestCaseSetUpProperly() { 
     assertNotNull("activity should be launched successfully", getActivity()); 
    } 
} 

Las dos clases que he creado son los siguientes y fragment_layout es un LinearLayout vacío:

FrameLayout.java 
public class FragmentLayout extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.fragment_layout); 
    } 
} 

Y

FragmentLayoutSupport.java 
public class FragmentLayoutSupport extends FragmentActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.fragment_layout); 
    } 
} 

Respuesta

50

Pasé la mitad de la noche en esto, y finalmente encontré una solución. La línea clave es:

04-05 18:00:11.276, (Lcom/example/android/app/FragmentLayoutSupport; had used a different Landroid/support/v4/app/FragmentActivity; during pre-verification). 

El problema es que el androide-support-v4.jar que se está utilizando en su proyecto de prueba es diferente de aquella en su proyecto de aplicación. Elimine todas las referencias a android-support-v4.jar de su proyecto de prueba. Luego vaya a su proyecto de aplicación Propiedades-> Ruta de compilación de Java-> Ordenar y exportar y revise android-support-v4.jar para exportarlo. Ahora ambos proyectos usarán la misma biblioteca, y Dalvik no se quejará.

+5

Eso era exactamente la misma. Vi esa línea en el registro de depuración, pero me sorprendió. Pensé que estaba diciendo que había usado diferentes versiones de android-support-v4.jar, que no tenía. Supongo que lo que está sucediendo es que la compilación de cada proyecto con su propia vinculación de ese archivo jar dio como resultado dos archivos dex codificados de forma exclusiva. Muy complicado y agradable de haber resuelto. Estaba casi listo para abandonar fragmentos como estaban, para todos los propósitos prácticos, no comprobables si usabas el lib de soporte. – securelpb

+1

Eres un salvavidas, esto me ha estado golpeando durante unas buenas tres horas. – tomtheguvnor

+5

¿Por qué no se aceptó como respuesta correcta? – Bostone

3

Para cualquier usuario IntelliJ que se encuentra con este problema, la solución equivalente es para establecer el alcance de su dependencia a 'Siempre' de la siguiente manera:

Archivo> Estructura del proyecto> Módulos> [Seleccionar la aplicación de prueba]> dependencias pestaña> seleccione 'Provisto' en el menú desplegable de alcance.

+0

Después de la migración a IntelliJ 11.1 mis pruebas dejaron de funcionar. Tu pista ayudó, gracias. – jki

+0

que ayudó ... ¡gracias! – Informatic0re

+0

He intentado todas las sugerencias en esta página, incluida la de la dependencia ... sin suerte. La prueba de actividad falla instanciando la actividad bajo prueba con "NoSuchMethod" .... :-( –

4

La respuesta IntelliJ de Rupert no me ayudó a llegar hasta allí. Resolví esto exportando el jar como lo sugirió la respuesta de Eclipse.

Archivo> Estructura del proyecto> Módulos> [seleccionar su aplicación principal]> pestaña Dependencias> cuadro de control de exportación, haga clic al lado del frasco de apoyo

IntelliJ Project Structure

+1

3 horas ¡Estaba buscando! También funciona con la versión 12 de Intellij – pommedeterresautee

Cuestiones relacionadas