2012-09-04 12 views
36

मैं अपने एंड्रॉइड प्रोजेक्ट में मॉकिटो का उपयोग करने की कोशिश कर रहा हूं। http://www.paulbutcher.com/2012/05/mockito-on-android-step-by-step/एंड्रॉइड पर मॉकिटो + डेक्समेकर

मूल रूप से यह Mockito + Dexmaker के नए संस्करण का उपयोग करता है और सब कुछ उम्मीद के रूप में काम करता है: मैं बहुत अच्छा ट्यूटोरियल है कि यह साथ सौदों मिल गया है।
हालांकि, जब मैं कुछ Android विशिष्ट वस्तु यानी उपहास करने के लिए प्रयास करें:

java.lang.IllegalArgumentException: 
    dexcache == null (and no default could be found; 
    consider setting the 'dexmaker.dexcache' system property) 
at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.java:359) 
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:252) 
at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:54) 
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26) 

किसी भी विचार है कि यह कैसे तय करने के लिए: मैं इस अपवाद प्राप्त

Context context = mock(Context.class); 

?

+0

आप उपयोग कर Gradle http://stackoverflow.com/questions/29290795/attempt-to-mockito-mock-any-class-generates-exceptionininitializererror/41350001# पर अपना जवाब देखने के अपने APK का निर्माण नहीं करते हैं अधिक जानकारी के लिए 41350001 –

उत्तर

33

से कभी नहीं बनाई गई है मेरे लिए बेहतर काम करता है:

System.setProperty(
    "dexmaker.dexcache", 
    getInstrumentation().getTargetContext().getCacheDir().getPath()); 

मैंने इसे अपने setUp() विधि में रखा है।

10

मैं एक फिक्स को टुकड़ा करने में कामयाब रहा हूं जो मेरे लिए काम कर रहा है। मैनिफेस्ट में मैंने बाहरी स्टोरेज को पढ़ और लिखना जोड़ा। परीक्षण के लिए मैंने परीक्षण में System.setProperty("dexmaker.dexcache", "/sdcard"); जोड़ा। एमुलेटर छवि में मैंने एक एसडी कार्ड जोड़ा।

मेरा मानना ​​है कि यह काम करता है क्योंकि द्वारा चूक mockito क्षुधा कैश निर्देशिका का उपयोग करने की कोशिश करता है, लेकिन मैं कभी नहीं एक गतिविधि चलाने इसलिए मुझे लगता है निर्देशिका @ MrChaz का जवाब, इस का @ rjath की टिप्पणी से ओएस

+3

आप यहां दिए गए अनुसार निम्न को भी कॉल कर सकते हैं - http://code.google.com/p/dexmaker/issues/detail?id=2 ... 'getInstrumentation()। GetTargetContext()। GetCacheDir (); ' – rajath

8

तो समस्या यह है कि डेक्समेकर एंड्रॉइड पर कैश पथ नहीं ढूंढ रहा है> = 4.3 जैसा कि अन्य लोगों ने उल्लेख किया है और जैसा कि this dexmaker issue में वर्णित है।

मैं, एक कस्टम instrumented परीक्षण धावक में समाधान के बजाय हर परीक्षा में की को लागू करने (या उनके सुपर क्लास) setUp() साथ चला गया क्योंकि यह थोड़ा कम hacky (यह वास्तव में केवल एक ही स्थान पर है लगता है - और हर उपवर्ग में विरासत में मिला नहीं) और अधिक लचीला।

public class CustomInstrumentationTestRunner extends InstrumentationTestRunner { 

    @Override public void onCreate (final Bundle arguments) { 
     super.onCreate(arguments); 

     // temporary workaround for an incompatibility in current dexmaker (1.1) implementation and Android >= 4.3 
     // cf. https://code.google.com/p/dexmaker/issues/detail?id=2 for details 
     System.setProperty("dexmaker.dexcache", getTargetContext().getCacheDir().toString()); 
    } 
} 

और जब चींटी के साथ बनाते, उसके AndroidManifest.xml में instrumented परीक्षण धावक के रूप में इस वर्ग का उपयोग करने के अपने प्रोजेक्ट (या परीक्षण परियोजना) की स्थापना: दस्तावेज की खातिर इन ऐसा करने के लिए आवश्यक परिवर्तन कर रहे हैं

<instrumentation 
    android:name="my.package.CustomInstrumentationTestRunner" 
    android:targetPackage="my.target.package" /> 

या उसके build.gradle जब Gradle साथ निर्माण: यदि आप अन्यहै, तो

android { 
    defaultConfig { 
     // ... 
     testInstrumentationRunner 'my.package.CustomInstrumentationTestRunner' 
    } 
    // ... 
} 

210 प्रविष्टियां, आप उनके बीच on the command line स्विच कर सकते हैं या अपने आईडीई चल रहे कॉन्फ़िगरेशन में से एक का चयन कर सकते हैं।

3

मुझे एंड्रॉइड लाइब्रेरी प्रोजेक्ट के लिए यह समस्या थी लेकिन एप्लिकेशन प्रोजेक्ट के लिए नहीं! उपरोक्त वर्णित सिस्टम प्रॉपर्टी "dexmaker.dexcache" को सेट करना इस मुद्दे के आसपास काम करता है। मैं चल रहा हूँ, Android 4.3 नेक्सस 4 डिवाइस, 19.0.3 उपकरण, लक्ष्य एपीआई 19, मेरी निर्भरता के साथ निर्माण:

androidTestCompile "org.mockito:mockito-core:1.9.5" 
androidTestCompile "com.google.dexmaker:dexmaker:1.0" 
androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.0" 
+0

मुझे अभी एहसास हुआ कि मैंने आपके द्वारा उल्लिखित वही चीज़ अनुभव की है (पुस्तकालय में समस्याएं लेकिन आवेदन नहीं), मुझे नहीं पता था कि उस समय यह क्यों हो रहा था। –

3

यह dexmaker परियोजना Google Code से GitHub ले जाया गया है की तरह लग रहा है।लेकिन केवल कुछ उपकरणों पर -

the maven central repository में वहाँ संस्करण 1.1 और 1.2 मार्च 2014 और दिसम्बर 2014

में प्रकाशित मैं प्रमाणित कर चुके हैं इस "dexcache == अशक्त" समस्या अभी भी संस्करण 1.2 के माध्यम से मौजूद है कर रहे हैं। उदाहरण के लिए, एंड्रॉइड 5.0 के साथ गैलेक्सी एस 5 में समस्या है, और एंड्रॉइड 4.4.2 के साथ गैलेक्सी एस 4 नहीं है।

मैंने गिटहब भंडार (last commit March 12th 2015 - ca74669) क्लोन किया, और स्थानीय रूप से भाग गया, और समस्या ठीक हो गई है (इतिहास में भी यह काम करता है जो इसे वापस लेता है)। तो एक बार 1.3 रिलीज होने के बाद, उम्मीद है कि यह समस्या अच्छी हो गई है!

बाकी

किसी 1.3-SNAPSHOT की स्थानीय प्रतिलिपि को चलाने के लिए चाहते हैं, यहाँ है कैसे मैंने वह किया (Mac पर है, लेकिन अन्य प्लेटफार्मों भी काम करना चाहिए, आप mvn, एडीबी, और dx की आवश्यकता होगी

  1. git clonehttps://github.com/crittercism/dexmaker.git
  2. cd dexmaker
  3. : पथ) पर निर्माण करने के लिए Maven का उपयोग कर androidTestCompile 'com.google.dexmaker:dexmaker:1.3-SNAPSHOT'
    • या pom.xml अगर, या ऊपर लिख ~/.m2/repository/com/google/dexmaker/dexmaker/1.3-SNAPSHOT/dexmaker-1.3-SNAPSHOT.jar के साथ अपने libs/dexmaker.jar यदि आप ग्रहण/चींटी

उपयोग कर रहे हैं: 10

  • cp -R ~/.m2/repository/com/google/dexmaker $ANDROID_HOME/extras/android/m2repository/com/google
  • फिर app/build.gradle में संस्करण को बदल साथ ही, Google कोड पर एक ही मुद्दे के लिए FYI, original issue report भी।

  • 2

    आप इसके बजाय एक निर्भरता के रूप में मॉकिटो कोर जोड़ सकते हैं। फिर, वह त्रुटि नहीं होगी और आपको कामकाज की आवश्यकता नहीं होगी।

    dependencies { 
        ... 
        testCompile 'org.mockito:mockito-core:1.10.19' 
    } 
    
    संबंधित मुद्दे