2016-04-25 9 views
6

से अलग परिणाम देता है मुझे पता है कि यह अजीब है, लेकिन यह मेरे पास है।JUnit4 TextUtils.isEmpty() String.isEmpty()

enter image description here

मैं एक Android आवेदन के लिए मेरे तर्क की जांच करने के लिए एक इकाई परीक्षण लिख रहा हूँ। परीक्षण निष्पादन के दौरान, मुझे लगता है कि यह है कि लाइन पर विफल रहता है:

if (!TextUtils.isEmpty(fromFile))

कि if बयान fromFile है इससे पहले कि "" (रिक्त स्ट्रिंग) के बराबर है, लेकिन किसी भी तरह यह एक और तर्क यह है कि नहीं करता है के साथ टूट जाता है इस पर से गुजरता है और खाली स्ट्रिंग की उम्मीद नहीं है।

डीबग में डाइविंग मैंने देखा कि fromFile.isEmpty() सही परिणाम देता है, लेकिन TextUtils.isEmpty(fromFile) कहता है कि यह खाली नहीं है।

ओपन सोर्स कोड, मैं देखें:

public static boolean isEmpty(@Nullable CharSequence str) { 
    if (str == null || str.length() == 0) 
     return true; 
    else 
     return false; 
} 

और String.java:

public boolean isEmpty() { 
    return value.length == 0; 
} 

मैं configutation निम्नलिखित है: JDK 1.8.0_77

मैं पूरी से बचने के लिए चाहते हैं स्ट्रिंग.इस लक्षण() को केवल परीक्षण पास करने के लिए ऐप में तर्क दें, क्योंकि मुझे एंड्रॉइड एपीआई 9 से पहले कोड का समर्थन करने की आवश्यकता है, जहां String.isEmpty उपलब्ध नहीं है, और अल तो TextUtils.isEmpty() और करें। स्पष्टीकरण और सुझावों के साथ कोई मदद उपयोगी होगी।

क्या किसी ने इसका सामना किया है? मुझे इसे कैसे ठीक करना चाहिए? अग्रिम में धन्यवाद!

उत्तर

7

जो कोई यह भविष्य में सामना करेंगे के लिए:

मैं अच्छा आदमी की मदद से यह पता लगा है कि यह Gradle में एंड्रॉयड इकाई परीक्षण विन्यास से संबंधित है:

testOptions { 
    unitTests.returnDefaultValues = true 
} 

कौन सा इशारा किया मुझे एक समाधान के लिए: आप buisness तर्क में एंड्रॉइड निर्भरताओं से छुटकारा पाएं कि आप जुनीट (यूनिट टेस्ट) के साथ परीक्षण कर रहे हैं।

मैंने android.text.TextUtils को अपनी खुद की विधि के साथ प्रतिस्थापित किया है जो MyStringUtils.java वर्ग में है, जो वही करता है।

समस्या यह थी कि एंड्रॉइड विधियों ने यूनिट परीक्षण चलाने के दौरान डेफल्ट मान वापस कर दिए थे, और वास्तव में यह fromFile मूल्य स्वयं की जांच नहीं करता था, बल्कि स्टब/डिफ़ॉल्ट मान लौटाता था।

+0

लेकिन थाई एक समाधान है? मेरा मतलब है कि इस मामले के लिए आपके पास केवल टेक्स्ट उपयोग हैं, लेकिन यदि आप एंड्रॉइड द्वारा प्रदान किए गए स्पार्सएरे और कुछ अन्य कस्टम उपयोगिता कार्यान्वयन का उपयोग करते हैं तो क्या होगा? – karate

+0

शुद्ध जुनीट परीक्षणों का विचार यह है कि उन्हें पीओजेओ (सादा ओल्ड जावा ऑब्जेक्ट) के खिलाफ उपयोग किया जाना है। 'स्पैसअरेरेस' पुराने जावा नहीं हैं। यदि आपके पास है, तो आप http://robolectric.org/ के साथ जा सकते हैं, जो Google https://developer.android.com/training/testing/fundamentals.html –

1

TextUtils एक जुनीट विधि नहीं है।आप TextUtils.isEmpty जवाब या अन्य विधि के साथ हेरफेर करने के लिए की जरूरत है, आप इसे पसंद नकली कर सकते हैं:

@PrepareForTest({TextUtils.class}) 

इसके अलावा जैसा कि ऊपर उल्लेख विधि:

mockStatic(TextUtils.class); 
when(TextUtils.isEmpty(any(CharSequence.class))).thenAnswer(new Answer<Boolean>() { 
     @Override 
     public Boolean answer(InvocationOnMock invocation) throws Throwable { 
      CharSequence str = (CharSequence) invocation.getArguments()[0]; 
      if (str == null || str.length() == 0) 
       return true; 
      else 
       return false; 
     } 
    }); 

PrepareForTest सूची TextUtils जोड़ने के लिए मत भूलना returnDefaultValues कॉन्फ़िगरेशन के लिए काम करता है:

testOptions { 
    unitTests.returnDefaultValues = true 
} 
+0

के अनुसार पूरी तरह से ठीक है दुर्भाग्य से हम ' पावरमॉक 'और' मॉकस्टैटिक 'लागू नहीं है। हम विभिन्न वास्तुकला में चले गए, जहां हमारी जावा कक्षाएं पीओजेओ हैं और उनके पास कोई एंड्रॉइड निर्भरता नहीं है। हम 'Utils.doSomething' जैसी स्थिर विधियों से दूर चले गए और सिंगलेट को हटा दिया। यह हमें डीआई और परीक्षण कवरेज पर अधिक नियंत्रण देता है। जहां तक ​​मुझे पता है कि कोडेकॉव अभी भी 'PowerMockito' का समर्थन नहीं करता है। लेकिन आपके उत्तर के लिए धन्यवाद, मुझे लगता है कि बहुत सारे देव इसे भी उपयोगी पाएंगे। –

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