2017-03-16 7 views
9

मैं एक यूनिट परीक्षण चलाने की कोशिश कर रहा हूं जो SQLiteOpenHelper की बाल कक्षा का नकल करता है लेकिन मुझे निम्न त्रुटि मिल रही है।एंड्रॉइड जुनीट टेस्ट java.lang.NoClassDefFoundError: एंड्रॉइड/डेटाबेस/स्क्लाइट/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) 
    ... 

मेरे Gradle फ़ाइल लग रहा है

तरह
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' 
} 

यह काम किया है इससे पहले कि मैं पुनर्स्थापित, एंड्रॉयड स्टूडियो और builtToolsVersion '25 .0.1 'के लिए अद्यतन।

मैं अपने परीक्षण धावक में अपनी एंड्रॉइड निर्भरता प्राप्त करने का एक तरीका ढूंढ रहा हूं।

+5

क्या यह './gradlew test' के साथ काम करता है? – tynn

+1

@tynn हाँ जो काम करता प्रतीत होता है, यह निर्भरता का एक गुच्छा डाउनलोड करता है, यह अब एंड्रॉइड स्टूडियो में भी काम करता है। मैंने सोचा था कि एंड्रॉइड स्टूडियो साइडबार में क्लिक करना "ग्रैडल> [माईप्रोजेक्ट्सनाम]> सत्यापन> परीक्षण" सीएलआई जैसा ही होगा, लेकिन मुझे लगता है कि कुछ अंतर है। यदि आप इसे उत्तर के रूप में पोस्ट करते हैं तो मैं +1 करूँगा और सही जांचूँगा। – Victory

+1

धन्यवाद @tynn, मेरे लिए काम किया। अब एएस –

उत्तर

19

कभी-कभी एंड्रॉइड स्टूडियो परीक्षण के लिए क्लासपाथ में एंड्रॉइड कक्षाओं को सही ढंग से लोड नहीं करता है। हमारे मामले में यह आमतौर पर android.os.Parcelable है। लेकिन सीआई हमेशा ठीक काम करता है।

तो ./gradlew test चलाना हमेशा ऐसे अवसरों में काम करना चाहिए और कुछ किस्मत एंड्रॉइड स्टूडियो के लिए निर्भरता को ठीक करना चाहिए।

+0

से भी काम करता है टिप के लिए धन्यवाद, यह मेरे लिए एंड्रॉइड स्टूडियो में एक बग जैसा लगता है। – Victory

+1

इसे सत्यापित नहीं किया जा सका। सीआई ने हालांकि मदद की। – tynn

+0

ने मेरा दिन बचाया, 1h पोकिंग के बाद और ऑनलाइन सहायता के लिए खोज – Ewoks

1

तुम भी कैश को अमान्य कोशिश करते हैं और फ़ाइल मेनू के तहत स्टूडियो में विकल्प पुनः आरंभ कर सकते

+0

यह मेरे लिए काम नहीं किया। –

6

(यह एक भ्रामक किया गया है और मुझे थोड़ी देर के लिए अब क्रुद्ध और मैं सुपर खुशी है कि मैं अंत में की तह तक मिल गया है गया है यह!)

नोट करने के लिए पहली बात यह अपनी परियोजना में निम्न आदेश ...

gradle clean build 

... आप अपने कार्यक्षेत्र में एक build/generated/mockable-android-XX.jar फ़ाइल देखना चाहिए चल रहा है कि के बाद है। यह फ़ाइल mockableAndroidJar ग्राडल टास्क द्वारा जेनरेट की गई है जो test ग्रैडल टास्क के हिस्से के रूप में चलाया जाता है जो build ग्रैडल कार्य के हिस्से के रूप में चलाया जाता है।

समस्या तब होती है जब यह फ़ाइल आपके कार्यक्षेत्र से गुम होती है लेकिन दुर्भाग्यवश दुर्भाग्यवश mockableAndroidJar कार्य का अनुमान लगाया जाता है और इसलिए इसे निष्पादित करता है। आप निम्न आदेश चलाकर पुष्टि कर सकते हैं ...

gradle mockableAndroidJar --info 

... और आप एक संदेश कुछ इस प्रकार दिखाई देगा ...

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

समाधान रन मजबूर करने के लिए है mockableAndroidJar Gradle टास्क जो आप निम्न आदेश चलाकर कर सकते हैं ...

gradle mockableAndroidJar --rerun-tasks 

... और देखा अब आपको build/generated/mockable-android-XX.jar फ़ाइल को अपने कार्यक्षेत्र में फिर से दिखाना चाहिए और आपके एंड्रॉइड यूनिट परीक्षण फिर से चल रहे हैं।

1

मेरे मामले में यह app/build निर्देशिका को साफ़ करके हल किया गया था। मुझे नहीं पता, लेकिन किसी कारण से gradle clean कमांड ने ऐसा नहीं किया और मुझे इसे मैन्युअल रूप से करना पड़ा

2

आज इस समस्या का सामना करने के बाद, मैं इसे फिर से काम करने के लिए जो करना चाहता हूं उसे साझा करना चाहता हूं।

आपके निर्माण में।फ़ाइल को क्रमबद्ध करें, जोड़ें:

android { 
... 

testOptions { 
     unitTests.returnDefaultValues = true 
    } 
} 

और फ़ाइलों को फिर से समन्वयित करें। यह अब काम करना चाहिए और नकली एंड्रॉइड जार फ़ाइल उत्पन्न की जानी चाहिए। यदि आपके पास अपनी gradle फ़ाइल में testOptions नहीं हैं, तो बस इसे हटाएं और resync।

मुझे उम्मीद है कि यह मदद करता है।

संबंधित मुद्दे