2012-01-15 7 views
6

लौटाता है मेरे पास कुछ सरल परीक्षण हैं, जैसे assertNotNull(mActivity); (मैं एमडी टोर्रेस "एंड्रॉइड एप्लिकेशन टेस्टिंग गाइड" पढ़ रहा हूं)। परीक्षण के तहत गतिविधि ठीक चलाता है। प्रत्येक एकल परीक्षण ठीक से चलाता है। लेकिन अगर मैं दूसरे टेस्ट getActivity() पर एक बार में कई परीक्षण चलाता हूं तो कभी वापस नहीं आता है। लॉगकैट में कोई त्रुटि नहीं है (अंतिम पंक्ति "प्रारंभिक इरादा ..."), कुछ भी नहीं। यदि मैं getActivity() में कदम करता हूं तो यह शिकायत करता है कि कोई स्रोत कोड उपलब्ध नहीं है, तो डिबगिंग बहुत मदद नहीं करता है।
एक अन्य परीक्षण परियोजना - Google से गतिविधि टेस्टिंग कई परीक्षणों के साथ भी ठीक है, इसलिए ग्रहण सही कॉन्फ़िगर किया गया है।
क्या किसी ने कभी ऐसा कुछ सामना किया?दूसरे परीक्षण पर प्राप्त करें एक्टिविटी() कभी भी

उत्तर

8

मैंने परीक्षण परियोजना को एक बार फिर से बनाया (जैसे "साफ कमरा") और यह काम किया। तब मैंने दो परियोजनाओं की तुलना की और अपराधी पाया। यह खाली टियरडाउन था:

protected void tearDown() throws Exception { 
} 

यदि मैं इसे हटा देता हूं, तो सभी परीक्षण हरे रंग में चलते हैं। अगर मैं इसे वापस पेस्ट करता हूं, तो दूसरा परीक्षण लटकता है। अब मैं स्पष्टीकरण पढ़ना चाहता हूं और उत्तर के रूप में इसे चिह्नित करने के लिए तैयार हूं।

संपादित करें: मुझे विधि के अंत में super.tearDown() पर कॉल करना चाहिए। सभी को परेशान करने के लिए खेद है।

+0

भयानक, धन्यवाद। –

+0

आप एकमात्र नहीं हैं। धन्यवाद! – iewnait

+0

मुझे यह समस्या भी थी, इसलिए आप इसे पूछकर किसी को भी परेशान नहीं कर रहे थे। मैं वास्तव में सराहना करता हूं कि आपने समाधान में जोड़ा है! – jwir3

1

मैंने ExoPlayer का उपयोग करके एक गतिविधि का परीक्षण करने के लिए ActivityInstrumentationTestCase2 का उपयोग किया और संसाधन को भी साफ करने के लिए सही किया। चूंकि साफ-सफाई और अंतिम जांच सभी परीक्षणों के लिए समान होती है, मैंने सोचा कि आंसूडाउन() उन्हें लागू करने के लिए एक अच्छी जगह है। सभी परीक्षण किसी भी समस्या के बिना अलग से चलते हैं, लेकिन जब मैं कई परीक्षण चलाता हूं, कभी-कभी प्राप्त करें सक्रियता() वापस नहीं आती है। (पास बुला गतिविधि के

  • जांच राज्य (विभिन्न ज़ोर() कॉल)
  • खिलाड़ी की जांच राज्य (विभिन्न ज़ोर() कॉल)
  • मैन्युअल खिलाड़ी संसाधनों को साफ: मेरी टियरडाउन() विभिन्न चीज़ें लागू() और रिलीज())
  • setActivity (शून्य) (इस मुसीबत)
  • super.tearDown()

मैं सभी सुझाव दिया समाधान की कोशिश की वजह से गतिविधि को बनाने और साफ करने के लिए उपकरण सक्रियता() को ओवरराइड करना और उपकरण के अन्य तरीकों का उपयोग करना। इन तरीकों से मदद नहीं मिली।

और बहुत सारे डिबगिंग से पता चला है कि उपरोक्त परिदृश्य के साथ पिछले परीक्षण की गतिविधि का ऑनस्टोरी() अगले परीक्षण की गतिविधि के ऑनक्रेट() के साथ ओवरलैप कर सकता है।

test1.getActivity(); 
test1.tearDown() called; 
test1.tearDown() over; 
test2.getActivity() 
test2.onCreate(); 
test1.onStop(); --> why is this late? 
test1.onDestroy(); --> why is this late? 
test2.tearDown() called; 
test2.tearDown() over; 
test3.getActiviy() --> this should call test3.onCreate, but did not and never returned. 

यह भी जब परीक्षण मामलों अलग ActivityInstrumentationTestCase2 वर्गों/फाइलों में लागू किया जाता है होता है: तो लॉग इस क्रम में जीवन चक्र की घटनाओं से पता चला है। और मुट्ठी के समय इस ओवरलैप में अभी तक परेशानी नहीं होती है, इसलिए 2 परीक्षण हमेशा ठीक होते हैं, लेकिन किसी भी क्रम में 3 परीक्षण चलाते हैं जिसके परिणामस्वरूप यह ओवरलैप तीसरे कॉल को प्राप्त करने के लिए सक्रियता() कभी वापस नहीं आती है।

मैं onPause() + onStop() + OnDestroy() कॉल मैन्युअल उपकरण का उपयोग कर की तरह सब कुछ करने की कोशिश की, परीक्षण के बीच वास्तव में लंबी नींद की अवधि को शुरू करने, बल instrumentationTestCase की गतिविधि समाशोधन, मेरे टियरडाउन की जाँच करता है पुन: क्रम, लेकिन कुछ भी मदद की ।अंत में, मैं गलती से मेरे चेकों से पहले setActivity (शून्य) को हटा दिया, और जीवन चक्र की घटनाओं को सही ढंग से आदेश दिया गया:

test1.tearDown() called; 
test1.onStop(); 
test1.onDestroy(); 
test1.tearDown() over; 
test2.getActivity() 
test2.onCreate(); 
... 

तो क्या वास्तव में मेरे मामले में फर्क पड़ा: ActivityTestCase.setActivity कॉल नहीं करते()। यह super.tearDown() को सीधे गतिविधि की जीवन चक्र घटनाओं को कॉल नहीं करने का कारण बनता है, बाद में साफ हो जाएगा और परेशानी होगी।

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