tag studio android gradle android-gradle robolectric robolectric-gradle-plugin

android - studio - ClassCastException: NoClassDefFoundError no se puede convertir en RuntimeException



android tag (3)

Después de actualizar Android Gradle Plugin a 1.1.3 desde 1.1.0, la excepción desapareció. ¿Alguien más puede confirmar esto? Estoy usando la configuración que se describe aquí: http://nenick-android.blogspot.de/2015/02/android-studio-110-beta-4-and.html

Estoy trabajando en actualizar mi base de código a Gradle 2.2 y Android Studio 1.0. Actualmente estoy tratando de hacer que Robolectric 2.4 funcione, pero estoy experimentando un problema extraño cuando intento ejecutar las Pruebas Unitarias. El problema ocurre solo después de un gradle clean ; ejecutar el conjunto de pruebas varias veces producirá pruebas de aprobación (como se espera). Cuando ejecuto las pruebas después de una limpieza, aparece el siguiente error:

java.lang.ClassCastException: java.lang.NoClassDefFoundError cannot be cast to java.lang.RuntimeException

He rastreado el error de nuevo a esta llamada:

Activity activity = Robolectric.setupActivity(MainActivity.class);

Experimento este error si uso el complemento Robolectric gradle ( org.robolectric:robolectric-gradle-plugin:0.14.0 ) o el complemento de prueba de la unidad JC and K Android ( com.github.jcandksolutions.gradle:android-unit-test:2.1.1 ).

Encontré este problema referenciado en Robolectric Github, pero no parece que se haya resuelto todavía: https://github.com/robolectric/robolectric/issues/1385

También se hace referencia a este problema en el complemento de prueba de la unidad de Android Studio, en "Solución de problemas": https://github.com/evant/android-studio-unit-test-plugin

Mi código de muestra actual está aquí: https://github.com/KioKrofovitch/robolectric-upgrade-test

He podido ejecutar el proyecto api-android-16 en las muestras de Robolectric sin ver este problema, aunque los proyectos api-android-19 y api-android-21 fallan por otras razones. No puedo ver lo que están haciendo de manera diferente, por lo que no obtienen este fracaso. https://github.com/robolectric/robolectric-samples

¿Alguien ha encontrado una solución a esto? Ejecutar las pruebas dos veces no es una buena solución para las herramientas de CI como Jenkins o Travis.

EDITAR: Incrustar ejemplos de código

Mi nivel superior build.gradle donde agrego la biblioteca de prueba de JC y K Unit:

buildscript { repositories { mavenCentral() jcenter() } dependencies { classpath ''com.android.tools.build:gradle:1.0.0'' classpath ''com.github.jcandksolutions.gradle:android-unit-test:2.1.1'' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } }

Mi nivel de proyecto build.gradle, donde agrego en robolectric:

apply plugin: ''com.android.application'' repositories { mavenCentral() } android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.example.robolectrictest" minSdkVersion 15 targetSdkVersion 21 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro'' } } sourceSets { main { jniLibs.srcDirs = [''libs''] } androidTest { setRoot(''src/androidTest'') } } } // Must be after Android plugin apply plugin: ''android-unit-test'' dependencies { compile fileTree(dir: ''libs'', include: [''*.jar'']) compile ''com.android.support:appcompat-v7:21.0.3'' //androidTestCompile ''junit:junit:4.10'' //androidTestCompile ''org.robolectric:robolectric:2.4'' // Testing frameworks testCompile ''junit:junit:4.10'' testCompile ''org.robolectric:robolectric:2.4'' }

Mi actividad muy básica, todo se ha dejado como la plantilla lo crea:

public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }

Mi prueba ficticia, donde no puedo llegar a mi afirmación debido al error del método setupActivity ():

@Config(emulateSdk = 18) @RunWith(RobolectricTestRunner.class) public class ApplicationTest { @org.junit.Test public void testDummy() throws Exception { Activity activity = Robolectric.setupActivity(MainActivity.class); assertTrue(true); } }

EDIT # 2: Para ejecutar las pruebas, invoco los siguientes comandos del directorio de nivel superior de mi proyecto:

./gradlew clean ./gradlew test

También he intentado ejecutar las pruebas fuera del envoltorio de Gradle y obtuve los mismos resultados

gradle clean gradle test


Esto se confirmó como un problema con Robolectric 2.4 (Problema # 1385). El tema ha sido cerrado por Erich Douglass hoy, con el siguiente comentario:

Estamos trabajando en el soporte de appcompat para 3.0. Hasta entonces, no hay mucho que puedas hacer.

https://github.com/robolectric/robolectric/issues/1385

Por lo tanto, hasta que se publique la versión 3.0, usaré la siguiente solución:

./gradlew clean ./gradlew assemble ./gradlew test

Una vez que el ensamblaje se ha ejecutado, ha creado todos los elementos que aparentemente necesita Robolectric. A continuación, puede ejecutar sus pruebas con éxito. Esta solución es mejor que simplemente ejecutar ./gradlew build o ./gradlew test dos veces, ya que puede implementarse tanto localmente como en una herramienta de CI como Travis o Jenkins. La sintaxis para ejecutar varias tareas de Gradle en Jenkins está dejando un espacio único entre cada tarea:

assemble test


Mi problema está resuelto. Actualicé mi robolectirc a 2.4 y min SDK a 19 y soporte de Android a com.android.support:support-v13:19.1.0. Y también hizo cambios a los archivos iml para el mismo.

Gracias por su orientación y respuesta

Venkatraman