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:

  • Android Studio: Gradle - Build fehlschlägt - Ausführung fehlgeschlagen für Task ': dexDebug'
  • Java.lang.IllegalAccessError: Methode 'void android.support.v4.content
  • Gibt es ein Android gradle Build Task Abhängigkeiten Diagramm?
  • Fehler: Ursache: com.android.sdklib.repository.FullRevision
  • Android Build mit Gradle und ProGuard: "Das Ausgabe-Jar muss nach einem Eingabe-Jar angegeben werden, oder es ist leer"
  • Android Gradle Build-Datei mit Time Stempel läuft gestern Version
  •  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 

  • Warum nutzt multiDexEnabled (true) die App zu bauen, aber ständig abstürzen?
  • Beste Weg, um Aktivität zu einem Android-Projekt in Eclipse hinzuzufügen?
  • Android: Kann einfach nicht die 65k Problem zu beheben
  • Konvertieren Sie unveränderliche Bitmap-Datei in veränderbare Bitmap
  • Konvertieren Sie Java-Projekt in Android-Projekt auf Eclipse
  • Fehler: Dateipfad zu lang auf Windows, unter 240 Zeichen halten
  • 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.