2017-03-16 16 views
9

Tôi đang cố gắng chạy một bài kiểm tra đơn vị mô phỏng lớp con là SQLiteOpenHelper nhưng tôi nhận được lỗi sau.Android jUnit Kiểm tra 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) 
    ... 

tập tin của tôi Gradle trông giống như

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

này đã làm việc trước khi tôi cài đặt lại, Android Studio và cập nhật để builtToolsVersion '25 .0.1.

Tôi đang tìm cách để có được phụ thuộc Android của tôi trong Á hậu thử nghiệm của tôi.

+5

Tính năng này có hoạt động với './gradlew test' không? – tynn

+1

@tynn có vẻ như hoạt động, nó đã tải xuống một loạt các phụ thuộc, giờ đây nó cũng hoạt động trong Android Studio. Tôi nghĩ rằng nhấp vào thanh bên Android Studio "Gradle> [MyProjectsName]> Verfication> test" sẽ giống như CLI, nhưng tôi đoán có một số khác biệt. Nếu bạn đăng câu trả lời này, tôi sẽ +1 và Kiểm tra chính xác. – Victory

+1

Cảm ơn @tynn, đã làm việc cho tôi. Bây giờ cũng làm việc từ AS –

Trả lời

19

Thỉnh thoảng Android Studio không tải đúng các lớp Android vào đường dẫn lớp để thử nghiệm. Trong trường hợp của chúng tôi, nó thường là android.os.Parcelable. Nhưng CI luôn hoạt động tốt.

Vì vậy, chạy ./gradlew test phải luôn hoạt động trong những dịp như vậy và với một số may mắn khắc phục sự phụ thuộc cho Android Studio.

+0

Cảm ơn lời khuyên, điều này có vẻ giống như một lỗi trong Android Studio với tôi. – Victory

+1

Không thể xác minh. CI đã giúp. – tynn

+0

đã lưu ngày của tôi, sau 1h poking xung quanh và tìm kiếm sự giúp đỡ trực tuyến – Ewoks

1

Bạn cũng có thể thử vô hiệu hóa bộ nhớ cache và khởi động lại tùy chọn trong studio dưới trình đơn tập tin

+0

Nó không hoạt động đối với tôi. –

6

(Cái này đã gây nhầm lẫn và phẩn nộ cho tôi một thời bây giờ và tôi là siêu vui mừng cuối cùng tôi đã có để dưới cùng của nó!)

điều đầu tiên cần lưu ý là sau khi chạy lệnh sau đây trong dự án của bạn ...

gradle clean build 

... bạn nên thấy một tập tin build/generated/mockable-android-XX.jar trong không gian làm việc của bạn. Tệp này được tạo bởi Nhiệm vụ cấp độ mockableAndroidJar được chạy như một phần của Nhiệm vụ cấp độ test được chạy như một phần của nhiệm vụ Gradle build.

Sự cố xảy ra khi tệp này bị thiếu trong không gian làm việc của bạn nhưng Gradle tiếc là ước tính mockableAndroidJar Tác vụ được cập nhật và do đó bỏ qua thực thi nó. Bạn có thể xác minh điều này bằng cách chạy lệnh sau đây ...

gradle mockableAndroidJar --info 

... và bạn sẽ thấy một cái gì đó thông điệp như sau ...

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

Giải pháp là để buộc chạy các mockableAndroidJar Gradle công tác mà bạn có thể làm bằng cách chạy lệnh sau đây ...

gradle mockableAndroidJar --rerun-tasks 

... Và Voila bây giờ bạn sẽ thấy tệp build/generated/mockable-android-XX.jar xuất hiện trở lại trong không gian làm việc của bạn và thời gian vui mừng khi các bài kiểm tra đơn vị Android của bạn sẽ chạy lại.

1

Trong trường hợp của tôi, nó được giải quyết bằng cách xóa thư mục app/build. Tôi không biết nhưng vì lý do nào đó, không làm điều này và tôi phải làm điều đó bằng tay

2

Sau khi đối mặt với vấn đề này hôm nay, tôi muốn chia sẻ những gì tôi đã làm để làm cho nó hoạt động trở lại.

Trong bản dựng của bạn.tệp gradle, thêm:

android { 
... 

testOptions { 
     unitTests.returnDefaultValues = true 
    } 
} 

và đồng bộ hóa các tệp gradle một lần nữa. Nó sẽ làm việc ngay bây giờ và các tập tin jar android nhạo báng nên được tạo ra. Nếu bạn không có testOptions trong tệp gradle của mình, chỉ cần xóa nó và đồng bộ hóa lại.

Tôi hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan