2017-03-16 46 views
9

Próbuję uruchomić testy jednostkowe, które kpią z klasy potomnej SQLiteOpenHelper, ale otrzymuję następujący błąd.Android jUnit Test java.lang.NoClassDefFoundError: android/database/sqlite/SQLiteOpenHelper

java.lang.NoClassDefFoundError: android/database/sqlite/SQLiteOpenHelper 

    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
    ... 
at org.dfhu.vpodplayer.util.JsonExporterTest.export(JsonExporterTest.java:43) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    ... 

plik My Gradle wygląda

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 24 
    buildToolsVersion '25.0.1' 
    defaultConfig { 
     applicationId "org.dfhu.vpodplayer" 
     minSdkVersion 18 
     targetSdkVersion 24 
     versionCode 1 
     versionName "1.2" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    compileOptions { 
     targetCompatibility 1.7 
     sourceCompatibility 1.7 
    } 
} 


buildscript { 
    repositories { 
    mavenCentral() 
    } 
    dependencies { 
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 
    } 
} 

apply plugin: 'com.neenbedankt.android-apt' 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 

    compile 'com.android.support:appcompat-v7:24.2.1' 
    compile 'com.android.support:support-v4:24.2.1' 
    compile 'com.android.support:recyclerview-v7:24.2.1' 

    testCompile 'junit:junit:4.12' 
    testCompile 'org.powermock:powermock-api-mockito:1.6.5' 
    testCompile 'org.powermock:powermock-module-junit4:1.6.5' 
} 

ten nie działa, zanim ponownie zainstalować, Android Studio zaktualizowana builtToolsVersion '25 .0.1' .

Szukam sposobu na uzyskanie zależności od mojego androida w moim test runnie.

+5

Czy działa z testem './gradlew'? – tynn

+1

@tynn Tak, wydaje się, że działa, pobrał kilka zależności, również teraz działa w Android Studio. Myślałem, że kliknięcie na pasku bocznym Android Studio "Gradle> [MyProjectsName]> Verfication> test" byłoby tym samym co CLI, ale myślę, że jest jakaś różnica. Jeśli zamieścisz to jako odpowiedź, udzielę +1 i sprawdzę poprawność. – Victory

+1

Dzięki @tynn, pracował dla mnie. Teraz także działa od AS –

Odpowiedz

19

Czasami Android Studio nieprawidłowo ładuje klasy Androida do ścieżki klasy w celu przetestowania. W naszym przypadku zwykle jest to android.os.Parcelable. Ale CI zawsze działa dobrze.

Tak więc uruchamianie ./gradlew test powinno zawsze działać w takich sytuacjach i przy odrobinie szczęścia naprawić zależności dla Android Studio.

+0

Dzięki za wskazówkę, wydaje mi się, że to błąd w Android Studio. – Victory

+1

Nie można go zweryfikować. CI pomógł jednak. – tynn

+0

uratował mój dzień, po 1h wyszukuje i szuka pomocy online – Ewoks

1

Można również próbować unieważnić cache i uruchom opcję w studiu pod menu Plik

+0

To nie działa dla mnie. –

6

(To jeden został kłopotliwe i irytujące mnie na chwilę teraz i jestem bardzo zadowolony, że mam w końcu dostał się do dołu it!)

pierwszą rzeczą, którą należy zwrócić uwagę jest to, że po uruchamiając następującą komendę w projekcie ...

gradle clean build 

... ty powinny zobaczyć plik w obszarze roboczym build/generated/mockable-android-XX.jar. Ten plik jest generowany przez Zadanie Gradle mockableAndroidJar, które jest uruchamiane jako część zadania Gradle Task test, które jest uruchamiane jako część zadania Gradle Task .

Problem występuje, gdy brakuje tego pliku w obszarze roboczym, ale Gradle niestety szacuje, że zadanie mockableAndroidJar jest aktualne i dlatego pomija wykonanie tego. Można to sprawdzić, uruchamiając następującą komendę ...

gradle mockableAndroidJar --info 

... a zobaczysz wiadomość coś w następujący sposób ...

Skipping task ':Android:mockableAndroidJar' as it is up-to-date (took 0.001 secs). 

rozwiązanie jest zmuszenie bieg mockableAndroidJar Gradle zadanie, które można wykonać, uruchamiając następującą komendę ...

gradle mockableAndroidJar --rerun-tasks 

... I Voila Powinieneś teraz zobaczyć plik build/generated/mockable-android-XX.jar pojawiający się ponownie w twoim obszarze roboczym i cieszę się, że twoje testy jednostek z Androidem będą znowu działać.

1

Cóż w moim przypadku został rozwiązany przez wyczyszczenie katalogu app/build. Nie wiem, ale z jakiegoś powodu polecenie gradle clean, nie zrobiłem tego i musiałem to zrobić ręcznie

2

Po dzisiejszym spotkaniu z tym problemem, chciałbym podzielić się tym, co zrobiłem, aby ponownie zadziałało.

W Twojej kompilacji.plik gradle, dodaj:

android { 
... 

testOptions { 
     unitTests.returnDefaultValues = true 
    } 
} 

i ponownie zsynchronizuj pliki gradle. Powinno to teraz działać, a wygenerowany powinien zostać plik JAR z mocowalnym Androidem. Jeśli nie masz testOptions w pliku gradle, po prostu go usuń i zsynchronizuj ponownie.

Mam nadzieję, że to pomaga.