2011-11-10 14 views
12

के साथ यूनिट परीक्षण एंड्रॉइड एप्लिकेशन मेरे पास जावा लाइब्रेरी है जो एंड्रॉइड एपीआई से कुछ चीजों का उपयोग करती है। मैं इस पुस्तकालय के लिए यूनिट परीक्षण लिखने के लिए मॉकिटो का उपयोग करना चाहता हूं।एंड्रॉइड: रोबॉलेक्ट्रिक और मॉकिटो

क्या कोई तरीका है जिसके बारे में मैं जा सकता हूं? Using Mockito with Android virtual machine

अद्यतन:

Mockito Dalvik वी एम पर इस पोस्ट को अच्छा खेलने नहीं करता है, को देखने के

इस पोस्ट मैं Robolectric की खोज की है के बाद से, और मैं काम करने का अवसर मिला है पिवॉटल लैब्स से बाहर और इस पुस्तकालय में कुछ छोटे योगदान दें। मैं एंड्रॉइड परीक्षण ढांचे/मॉकिटो पर इसका उपयोग करने की सलाह दूंगा। इसके अलावा, आप Robolectric और Mockito का उपयोग करने के लिए स्वतंत्र हैं, लेकिन Robolectric में छाया वस्तुओं सबसे अधिक उपयोग मामलों के लिए Mockito अनावश्यक बनाते हैं।

यूनिट परीक्षण एंड्रॉइड की कोशिश करने में समस्या यह है कि आपके द्वारा निर्मित एंड्रॉइड लाइब्रेरी में स्टब अपवाद फेंकने या शून्य वापस करने के लिए हर विधि को स्टब किया जाता है। यदि आप अपने ऐप का परीक्षण करना चाहते हैं और किसी भी एंड्रॉइड व्यवहार को चाहते हैं तो आप भाग्य से बाहर हैं, जब तक कि आप रोबॉलेक्ट्रिक का उपयोग नहीं करते हैं, जो वर्गों को लोड करते समय फ्लाई पर बाइट कोड को फिर से लिखता है, और व्यवहार को अनुकरण करने वाली छाया वस्तु को इंजेक्ट करता है।

अद्यतन 2:

यह एक समय हो गया है और चीजें बदल गई। Robolectric में शैडो कक्षाओं में से कई को वास्तविक एंड्रॉइड कक्षाओं के साथ बदल दिया गया है। वास्तविक एंड्रॉइड जार अब उपयोग किए जाते हैं और रोबोइलेक्ट्रिक केवल चीजों के बहुत छोटे सेट के लिए छाया कक्षाएं लोड करता है। यह आपके एंड्रॉइड परीक्षण के लिए रोबोलेक्ट्रिक का उपयोग करने का एक और कारण है।

उत्तर

9

बहुत गुगलिंग के बाद, मैं इस here के उत्तर में आया हूं।

असल में इसमें Robolectric इकाई परीक्षण ढांचे का उपयोग करना शामिल है, जो एंड्रॉइड कक्षाओं के लोडिंग को रोकता है। फिर आप आगे बढ़ सकते हैं और मॉकिटो का उपयोग कर सकते हैं (हालांकि अधिकांश मामलों में यह आवश्यक नहीं है) और JVM पर अपने परीक्षण चलाएं!

+0

मैं रोबिलेक्ट्रिक द्वारा प्रदान किए गए बिल्डरों के साथ संयोजन में मॉकिटो से जासूस-निर्माण का उपयोग करता हूं। इस तरह जब आवश्यक हो तो मैं एंड्रॉइड घटकों का आंशिक मॉकिंग कर सकता हूं, उदा। FooActivity foo = spy (Robolectric.buildActivity (FooActivity.class) .get()); doReturn (नकली)। जब (foo) .getSomething(); – Alix

1

android-mock पर एक नज़र डालें। यह EasyMock 2.4 पर आधारित है (इसलिए मॉकिटो के रूप में काफी अच्छा नहीं है लेकिन बंद)।

यह रनटाइम के बजाय निर्माण समय पर नकली कक्षाओं को पूर्व-उत्पन्न करके DalvikVM की सीमाओं के आसपास आता है, और फिर डिवाइस पर तैनात करते समय उन्हें अपने संकलित परीक्षण कोड के साथ बंडल करता है।

Borachio नामक एक मॉकिंग फ्रेमवर्क भी है जिसे मैं नहीं देख सकता लेकिन आशाजनक लग रहा हूं (यदि आप अपने डिवाइस पर चलाने के लिए स्कैला प्राप्त करने के प्रस्तावों से गुज़रने में खुश हैं)।

+0

हाँ, मुझे लगता है कि एक के बारे में पता है। अगर मुझे ऐसा करने की ज़रूरत नहीं है तो मैं इसका इस्तेमाल करने से बचने की कोशिश कर रहा हूं। मॉकिटो पर सिंटैक्स बहुत अच्छा है। –

1

आप एंड्रॉइड एसडीके आंतरिक कक्षाओं के साथ कुछ भी नहीं करने के लिए, इससे बच सकते हैं। मैं अपने एंड्रॉइड प्रोजेक्ट्स के लिए यही कर रहा हूं (हालांकि मैं JMock2 का उपयोग करता हूं, Mockito नहीं)।

मेरे पास दो परीक्षण परियोजनाएं हैं।

  • पहले एक JUnit4 और JMock2 कि मैं अपने आप को निर्भरता के रूप में जोड़ा उपयोग करता है। मैं सभी "व्यापार तर्क" कक्षाओं का परीक्षण करता हूं, लेकिन मैं एंड्रॉइड (यूआई कक्षाएं, SQLiteOpenHelper, आदि) के साथ कुछ भी परीक्षण नहीं कर सकता हूं। यदि मैं अपने परीक्षणों में उनका उपयोग करने का प्रयास करता हूं, तो मुझे डर Stub! अपवाद मिलता है।

  • ActivityInstrumentationTestCase2 और Robotium का उपयोग करके यूआई का परीक्षण करने वाला दूसरा दूसरा।

कि काम और जटिल का एक बहुत की तरह लग सकता है, लेकिन वास्तव में ऐसा नहीं है, और मैं वास्तव में लगता है कि यह उन्हें अलग करना बेहतर है।यूआई परीक्षण "असली" इकाई-परीक्षण नहीं होते हैं और वे अक्सर कई इकाइयों में कुछ विशेषताओं का परीक्षण करते हैं। यदि आप अपने यूआई परत को अपने व्यावसायिक तर्क से ठीक से अलग करते हैं (और परीक्षणों के इस अलगाव को करने से आप टीडीडी शैली में ऐसा करने के लिए मजबूर होंगे), तो यह सब अच्छा और चिकना है।

+0

श्वास। समस्या यह है कि मेरे व्यवसाय मॉडल वर्ग प्रत्येक पृष्ठ पर ऐप में उपयोग किए जा रहे डेटा के हर हिस्से को पकड़ने के लिए AsyncTask का उपयोग करते हैं। मैं सोच रहा था, क्योंकि AsyncTask मूल रूप से एक POJO है कि मैं इसके लिए कोड पकड़ सकता हूं और इसे अपने प्रोजेक्ट में डाल सकता हूं और निर्भरता खो सकता हूं। –

+0

यदि मैं आप थे, तो मैं इंटरफ़ेस के लिए सभी एंड्रॉइड निर्भरताओं को सारणीबद्ध करने का प्रयास करूंगा, ताकि स्टब रास्ते में न आएं। शायद AsyncTask के साथ लगता है जितना आसान नहीं है ... – Guillaume

+0

@ चाइस्टोफर पेरी: क्या आपको एसिंक कार्य को प्रभावी ढंग से जांचने के लिए आपकी समस्या का कुछ समाधान मिला? मैं अब एक ही नाव में थोड़ी सी हूँ। – bianca

2

संस्करण 1.9.5 (जून 3, 2012 को जारी किया गया) के रूप में आप एंड्रॉइड के साथ मॉकिटो का उपयोग कर सकते हैं। ऐसा करने के लिए आप भी dexmaker की आवश्यकता होगी:

http://code.google.com/p/dexmaker/

इस विकि पृष्ठ यह कैसे लागू करें:

http://code.google.com/p/dexmaker/wiki/Mockito

+0

यह आपको कोई एंड्रॉइड व्यवहार नहीं देता है। Robolectric अभी भी सबसे अच्छा विकल्प है, क्योंकि यह मोक्स (छाया कक्षाएं) और एंड्रॉइड व्यवहार प्रदान करता है। –

+2

मैं समझता हूं, लेकिन आपका सवाल यह नहीं था कि 'एंड्रॉइड के लिए सबसे अच्छा मॉकिंग फ्रेमवर्क क्या है' लेकिन 'मैं एंड्रॉइड के साथ मॉकिटो का उपयोग कैसे कर सकता हूं'। –

+0

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

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