2016-11-17 7 views
6

में शून्य देता है यह सरल इकाई परीक्षण हमेशा गुजरता है और मैं यह नहीं समझ सकता कि क्यों।Uri.parse() हमेशा यूनिट परीक्षण

@RunWith(JUnit4.class) 
class SampleTest { 
    @Test testSomething() { 
     Uri uri = Uri.parse("myapp://home/payments"); 
     assertTrue(uri == null); 
    } 
} 

क्या मैं अब तक की कोशिश की है एक "पारंपरिक" यूआरआई (http://example.com), लेकिन uri उपयोग कर रहा है भी null था।

उत्तर

4

चेक आप अपने ऐप के Gradle फ़ाइल में निम्न अगर:

android { 
    ... 
    testOptions { 
     unitTests.returnDefaultValues = true 
    } 

Uri एक Android वर्ग है और इस तरह के रूप में स्थानीय इकाई परीक्षण में इस्तेमाल नहीं किया जा सकता है, कोड के बिना ऊपर आप निम्नलिखित प्राप्त:

java.lang.RuntimeException: Method parse in android.net.Uri not mocked. See http://g.co/androidstudio/not-mocked for details. 

उपरोक्त कोड इस अपवाद को दबाता है और इसके बजाय डमी कार्यान्वयन डिफ़ॉल्ट मान लौटाता है (null इस मामले में)।

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

+0

मैंने अपने ओपी में कहा कि परीक्षण गुजरता है इसलिए कोई अपवाद नहीं फेंक दिया जाता है। इसके अलावा मुझे न केवल एक गैर-शून्य उरी वस्तु की आवश्यकता है, मुझे विशिष्ट गुणों (योजना, पथ, आदि) के साथ एक उरी वस्तु की आवश्यकता है। –

+0

मैंने इसे जोड़ा है, लेकिन अभी भी – Allen

2

उरी एंड्रॉइड क्लास है इसलिए इसे परीक्षणों में उपयोग करने से पहले मजाक करने की आवश्यकता है। , https://stackoverflow.com/a/34152256/5199320

0

अंत में मैं सिर्फ String के रूप में स्वीकार करने के लिए यूआरआई मेरी कोड बदल तो अब यह दोनों उत्पादन और परीक्षण में काम करता है और Uri.parse() के उपयोग को छोड़ देते हैं:

उदाहरण के लिए इस सवाल का जवाब देखें। अब जहां एक यूआरआई की आवश्यकता है, मैं String को पार्स करने के बजाय uri.toString() का उपयोग करता हूं।

+1

काम नहीं करता है, मुझे नहीं लगता कि यह एक अच्छा विचार है। उरी का उपयोग करके आप स्ट्रिंग की तुलना में सुरक्षित रूप से उच्च स्तर का प्रकार प्रदान करते हैं। स्ट्रिंग्स में कुछ भी हो सकता है, उरी के साथ आप कम से कम जानते हैं कि यह एक वैध उरी है। आपके यूनिट परीक्षणों को आपकी कोड गुणवत्ता में वृद्धि करना चाहिए, इसे कम नहीं करना चाहिए। मैं इस परीक्षण को एक जुड़े (एस्प्रेसो) परीक्षण में बदल दूंगा। – Michael

2

मैं इस समस्या को Robolectric के साथ हल करता हूं।

ये मेरे इकाई परीक्षण config हैं

build.gradle

dependencies { 
... 
testCompile 'junit:junit:4.12' 
testCompile "org.robolectric:robolectric:3.4.2" 
} 

परीक्षण वर्ग

@RunWith(RobolectricTestRunner.class) 
public class TestClass { 

    @Test 
    public void testMethod() { 
     Uri uri = Uri.parse("anyString") 
     //then do what you want, just like normal coding 
    } 
} 

यह मेरे लिए काम करता है, उम्मीद है कि इस मदद कर सकता है।

+0

इस पर -1 क्यों? मेरे दिमाग में, यह वास्तविक सही उत्तर है क्योंकि रोबॉलेक्ट्रिक आपको यूरी का एक वास्तविक कार्यान्वयन देता है, न केवल एक नकली, साथ ही यूनिट परीक्षण एंड्रॉइड के लिए आपको जो कुछ भी चाहिए, उसके कार्यान्वयन के साथ। – Bradford2000

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