ClassCastException: NoClassDefFoundError kann nicht in RuntimeException gegossen werden

Ich arbeite daran, meine Codebasis auf Gradle 2.2 und Android Studio 1.0 zu aktualisieren. Ich versuche derzeit, Robolectric 2.4 zu bekommen, aber ich erlebe ein seltsames Problem, wenn ich versuche, Unit Tests durchzuführen. Das Problem tritt erst nach einem gradle clean ; Das Ausführen der Test-Suite wird mehrfach durchlaufende Tests (wie erwartet). Wenn ich die Tests nach einem sauberen, ich bekomme die folgenden Fehler:

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

Ich habe den Fehler auf diesen Anruf zurückgeführt:

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

Ich erlebe diesen Fehler, ob ich das Robolectric gradle Plugin ( org.robolectric:robolectric-gradle-plugin:0.14.0 ) oder das JC und K Android Unit Test Plugin ( com.github.jcandksolutions.gradle:android-unit-test:2.1.1 ).

Ich fand dieses Problem auf dem Robolectric Github bezogen, aber es sieht nicht so aus, als wäre es noch angesprochen worden: https://github.com/robolectric/robolectric/issues/1385

Diese Ausgabe wird auch in der Android-Studio-Unit-Test-Plugin, unter 'Trouble Shooting' referenziert: https://github.com/evant/android-studio-unit-test-plugin

Mein aktueller Beispielcode ist hier: https://github.com/KioKrofovitch/robolectric-upgrade-test

Ich habe das api-android-16-Projekt auf den Robolectric-Samples laufen lassen, ohne dieses Problem zu sehen, obwohl api-android-19 und api-android-21-Projekte aus anderen Gründen scheitern. Ich kann nicht sehen, was sie anders machen, so dass sie dieses Versagen nicht bekommen. Https://github.com/robolectric/robolectric-samples

Hat jemand hier einen Workaround gefunden? Das Ausführen der Tests zweimal ist kein guter Workaround für CI-Tools wie Jenkins oder Travis.

EDIT: Einbetten von Codebeispielen

Meine oberste Ebene build.gradle wo ich die JC und K Unit Testbibliothek hinzufügen:

 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() } } 

Mein Projekt Ebene build.gradle, wo ich in robolectric hinzufügen:

 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' } 

Meine ganz grundlegende Aktivität, alles ist übrig geblieben, als die Vorlage es schafft:

 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); } } 

Mein Dummy-Test, wo ich nicht zu meinem Assert aufgrund der setupActivity () Methode Fehler:

 @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: Um die Tests auszuführen, rufe ich die folgenden Befehle aus dem Top-Level-Verzeichnis meines Projekts auf:

 ./gradlew clean ./gradlew test 

Ich habe auch versucht, die Tests außerhalb der Gradle Wrapper laufen, und erhalten die gleichen Ergebnisse

 gradle clean gradle test 

  • Android.content.res.Resources $ NotFoundException in Robolectric 2.4
  • Manifest und Setup Probleme mit Robolectric arbeiten mit Android Studio 1.1.0
  • Ich studiere Robolectric, aber ein Fehler ist aufgetreten
  • Android Studio + Robolectric + Gradle Klasse Nicht gefunden Ausnahme
  • Wie benutzt man findViewById () in robolectric
  • Robolectric Unit Tests scheitern nach Multidex
  • Wie führe ich Unit-Test auf einem Android-Modul?
  • 3 Solutions collect form web for “ClassCastException: NoClassDefFoundError kann nicht in RuntimeException gegossen werden”

    Dies wurde als Problem mit Robolectric 2.4 (Ausgabe Nr. 1385) bestätigt. Das Thema wurde heute von Erich Douglass geschlossen, mit folgendem Kommentar:

    Wir arbeiten an appcompat Unterstützung für 3.0. Bis dahin gibt es nicht viel, was du tun kannst.

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

    So, bis 3.0 freigegeben wird, werde ich die folgende Problemumgehung verwenden:

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

    Sobald das Zusammenbau läuft, hat es alle Gegenstände geschaffen, die Robolectric anscheinend braucht. Dann können Sie Ihre Tests erfolgreich durchführen. Diese Lösung ist besser als nur ausgeführt ./gradlew build oder ./gradlew test zweimal, weil es sowohl lokal als auch auf einem CI-Tool wie Travis oder Jenkins implementiert werden kann. Die Syntax für das Ausführen mehrerer Gradle-Aufgaben in Jenkins verlässt einen einzelnen Raum zwischen jeder Aufgabe:

     assemble test 

    Nach dem Upgrade von Android Gradle Plugin auf 1.1.3 ab 1.1.0 ging die Ausnahme weg. Kann sonst noch jemand das bestätigen? Ich benutze das hier beschriebene Setup: http://nenick-android.blogspot.de/2015/02/android-studio-110-beta-4-and.html

    Mein Problem ist gelöst. Ich habe mein robolectirc auf 2.4 und min SDK auf 19 und Android-Unterstützung auf com.android.support:support-v13:19.1.0 aktualisiert. Und auch Änderungen an iml-Dateien für das gleiche.

    Danke für Ihre Anleitung und Antwort

    Venkatraman

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.