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