18

पर नहीं डाला जा सकता है, मैं अपने कोडबेस को Gradle 2.2 और Android Studio 1.0 में अपग्रेड करने पर काम कर रहा हूं। मैं वर्तमान में Robolectric 2.4 काम करने की कोशिश कर रहा हूं, लेकिन जब मैं यूनिट टेस्ट को चलाने और चलाने का प्रयास करता हूं तो मुझे एक अजीब समस्या का सामना करना पड़ रहा है। समस्या केवल gradle clean के बाद होती है; टेस्ट सूट को कई बार चलाने से गुजरने वाले परीक्षण (अपेक्षित) उत्पन्न होंगे।क्लासकास्ट अपवाद: NoClassDefFoundError को RuntimeException

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

मैं इस कॉल के लिए वापस त्रुटि का पता लगाया है:: जब मैं एक साफ करने के बाद परीक्षण चलाने, मैं निम्नलिखित त्रुटि मिलती है

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

मैं इस त्रुटि का सामना है कि क्या मैं Robolectric Gradle प्लगइन का उपयोग (org.robolectric:robolectric-gradle-plugin:0.14.0) या जेसी और के एंड्रॉइड यूनिट परीक्षण प्लगइन (com.github.jcandksolutions.gradle:android-unit-test:2.1.1)।

मैं इस मुद्दे Robolectric Github पर संदर्भित मिला, लेकिन यह नहीं लगता है जैसे अभी तक इसका समाधान कर दिया गया है https://github.com/robolectric/robolectric/issues/1385

यह समस्या भी एंड्रॉयड स्टूडियो इकाई परीक्षण प्लगइन में संदर्भित है, के तहत 'मुसीबत शूटिंग ': https://github.com/evant/android-studio-unit-test-plugin

मेरे वर्तमान नमूना कोड यहाँ है: https://github.com/KioKrofovitch/robolectric-upgrade-test

मैं कटका बिना Robolectric नमूनों पर api-एंड्रॉयड -16 परियोजना को चलाने के लिए सक्षम किया गया है इस मुद्दे को जी, हालांकि एपीआई-एंड्रॉइड -1 9 और एपीआई-एंड्रॉइड -21 परियोजनाएं अन्य कारणों से विफल रही हैं। मैं नहीं देख सकता कि वे अलग-अलग क्या कर रहे हैं ताकि उन्हें यह विफलता न हो। https://github.com/robolectric/robolectric-samples

क्या किसी को इसका कोई काम मिल गया है? दो बार परीक्षण चलाना जेनकिन्स या ट्रेविस जैसे सीआई उपकरणों के लिए अच्छा काम नहीं है।

संपादित करें: एम्बेड कोड नमूने

मेरे शीर्ष स्तर build.gradle जहाँ मैं जे.सी. और कश्मीर इकाई परीक्षण पुस्तकालय जोड़ें:

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

मेरे परियोजना स्तर build.gradle, जहां मैं robolectric में जोड़ें:

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

के रूप में टेम्पलेट यह बनाता है मेरे बहुत ही बुनियादी गतिविधि, सब कुछ छोड़ दिया गया है:

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

मेरे डमी परीक्षण, जहाँ मैं setupActivity() विधि त्रुटि के कारण मेरी ज़ोर तक नहीं पहुंच सकतीं:

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

} 

संपादित करें # 2: परीक्षण मैं से निम्न कमांड आह्वान को चलाने के लिए अपने प्रोजेक्ट के शीर्ष स्तर निर्देशिका:

./gradlew clean 
./gradlew test 

मैं भी Gradle आवरण के बाहर परीक्षण चलाने की कोशिश की है, और एक ही परिणाम प्राप्त

gradle clean 
gradle test 
+1

क्या आप वास्तव में इस प्रश्न में प्रासंगिक कोड पेस्ट कर सकते हैं? मुझे नहीं पता कि आपकी जिथब परियोजना से कौन सी फाइलें देखी जा रही हैं। –

+0

निश्चित रूप से, धन्यवाद! मैंने सबसे प्रासंगिक कोड स्निपेट –

+0

सही जोड़ा है। निश्चित रूप से एक क्रमिक मुद्दा, और मुझे डर है कि मैं धीरे-धीरे के बारे में बहुत कम जानता हूं, इसलिए यह आपकी मदद करने की मेरी क्षमता से परे है। हालांकि मैंने जो किया है, वह इस सवाल में एंड्रॉइड टैग के लिए ग्रेडल टैग को प्रतिस्थापित करता है, उम्मीद है कि कुछ स्नातक विशेषज्ञ साथ आएंगे और आपका प्रश्न ढूंढेंगे। क्षमा करें कि मैं और अधिक मदद नहीं कर सका। –

उत्तर

13

यह रोबोलेक्ट्रिक 2.4 (अंक # 1385) के साथ एक समस्या के रूप में पुष्टि की गई थी।समस्या निम्न टिप्पणी के साथ आज एरिक डगलस द्वारा बंद कर दिया गया है,:

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

एक बार:

We are working on appcompat support for 3.0. Until then, there's not much you can do.

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

तो जब तक 3.0 जारी की है, मैं निम्नलिखित तरीके को उपयोग किया जाएगा इकट्ठा हो गया है, इसने सभी वस्तुओं को बनाया है जो रोबोलेक्ट्रिक को स्पष्ट रूप से चाहिए। फिर आप अपने परीक्षणों को सफलतापूर्वक चला सकते हैं। यह समाधान ./gradlew build या ./gradlew test को दो बार चलाने से बेहतर है, क्योंकि इसे स्थानीय रूप से और ट्रैविस या जेनकींस जैसे सीआई उपकरण पर भी कार्यान्वित किया जा सकता है। जेनकिंस में एकाधिक ग्रैडल कार्यों को चलाने के लिए वाक्यविन्यास प्रत्येक कार्य के बीच एक ही स्थान छोड़ रहा है:

assemble test 
+0

क्या कोई अन्य कामकाज है? यह मेरे लिए काम नहीं करता है। –

0

मेरा मुद्दा हल हो गया है। मैंने अपने robolectirc को 2.4 और न्यूनतम एसडीके को 1 9 तक अपडेट किया और com.android.support:support-v13:19.1.0 को एंड्रॉइड समर्थन अपडेट किया। और इसके लिए आईएमएल फाइलों में भी बदलाव आया।

आपका मार्गदर्शन और प्रतिक्रिया

वेंकटरमन

1

के लिए धन्यवाद 1.1.0 से 1.1.3 के लिए Android Gradle प्लगइन अपग्रेड करने के बाद अपवाद चला गया। क्या कोई और इसकी पुष्टि कर सकता है? मैं यहां वर्णित सेटअप का उपयोग कर रहा हूं: http://nenick-android.blogspot.de/2015/02/android-studio-110-beta-4-and.html

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