2015-11-26 12 views
20

मानक का उपयोग निम्नलिखित परीक्षण मामले पर विचार करें JUnit का दावा है और hamcrest के assertThat:हैमक्रिस्ट क्यों कहता है कि बाइट 0 int 0 के बराबर नहीं है?

byte b = 0; 
int i = 0; 

assertEquals(b, i); // success 
assertThat(b, equalTo(i)); // java.lang.AssertionError: Expected: <0> but: was <0> 

if (b == i) { 
    fail(); // test fails, so b == i is true for the JVM 
} 

कि इतने क्यों है? मान JVM के लिए स्पष्ट रूप से बराबर हैं क्योंकि b == itrue है, तो hamcrest क्यों विफल हो जाता है?

+6

क्योंकि 'Byte.valueOf ((बाइट) 0) .equals (Integer.valueOf (0))' गलत है। – assylias

+1

उपरोक्त * assylias * 'उदाहरण में देखा गया है, बाइट एक बाइट-ऑब्जेक्ट में ऑटो-बॉक्स किया जाता है। जैसा कि [हैमक्रिस्ट के बराबर डॉक्स] में देखा गया है (http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/core/IsEqual.html#equalTo (T)) यह ऑब्जेक्ट 1.equals (ऑब्जेक्ट 2) का उपयोग करता है। चूंकि बाइट और int दोनों प्राइमेटिव हैं, इसलिए यह उन्हें बाइट और इंटीजर ऑब्जेक्ट्स पर ऑटो-बॉक्स करता है। Byte1।बराबर (इंटीजर 1) झूठी वापसी करेगा, भले ही इन बॉक्स किए गए ऑब्जेक्ट के मान समान हों। –

उत्तर

28

Assert#assertThat एक सामान्य विधि है। आदिम प्रकार जेनेरिक के साथ काम नहीं करते हैं। इस मामले में, byte और int को क्रमश: Byte और Integer पर बॉक्स किया गया है।

यह तो (assertThat भीतर)

Byte b = 0; 
Integer i = 0; 

b.equals(i); 

Byte#equals(Object) के कार्यान्वयन की जाँच करता हो जाता है तर्क प्रकार Byte की है, false तुरंत लौटने अगर यह नहीं है।

दूसरी ओर, assertEqualsAssert#assertEquals(long, long) जो मामले में दोनों byte और int तर्क long मूल्यों करने के लिए प्रोत्साहित कर रहे हैं। आंतरिक रूप से, यह दो प्राइमेटिव long मानों पर == का उपयोग करता है जो बराबर हैं।


ध्यान दें कि यह मुक्केबाजी रूपांतरण काम करता है क्योंकि assertThat

public static <T> void assertThat(T actual, Matcher<? super T> matcher) { 

जहां byteT के लिए एक Byte को बॉक्सिंग के रूप में घोषित किया जाता है, और int एक (करने के लिए कॉल के भीतर एक Integer को बॉक्सिंग है equalTo), लेकिन के रूप में अनुमानित Matcher<? super T> से मेल खाता है।

यह जावा 8 के बेहतर जेनेरिक अनुमान के साथ काम करता है। आप इसे

13

जावा 7 में काम करते हैं यह इसलिए होता है क्योंकि int और byteInteger और Byte को बॉक्सिंग कर रहे हैं के रूप में hamcrest matchers वस्तुओं पर, पुरातन पर नहीं संचालित करने के लिए स्पष्ट प्रकार तर्क आवश्यकता होगी। तो तुम एक Byte के साथ एक Integer तुलना कर रहे हैं, और Byte.equals() के कार्यान्वयन है:

public boolean equals(Object obj) { 
    if (obj instanceof Byte) { 
     return value == ((Byte)obj).byteValue(); 
    } 
    return false; 
} 

और Integer.equals():

public boolean equals(Object obj) { 
    if (obj instanceof Integer) { 
     return value == ((Integer)obj).intValue(); 
    } 
    return false; 
} 

दूसरे शब्दों में, एक Integer और Byte हमेशा असमान हैं। प्राइमेटिव की तुलना करते समय, बस इसके बजाय Assert.assertEquals का उपयोग करें। हैमक्रिस्ट मैचर्स शक्तिशाली हैं, लेकिन ज्यादातर (जटिल) ऑब्जेक्ट दावे के लिए लक्षित हैं।

+0

क्या जावा के लिए एक ही सीमा में मूल्यों की जांच नहीं करने का कोई कारण है? जैसे 'अगर (ओबीजे उदाहरण पूर्णांक) {वापसी ((पूर्णांक) obj) .intValue() == (int) मान;}' 'Byte.equals()' में? – sina

+0

@sina ठीक है, शायद यही वजह है कि हमारे पास प्राइमेटिव हैं जिनका हम उपयोग कर सकते हैं। जब जावा दो ऑब्जेक्ट्स की तुलना करता है, तो यह पहले जांच करता है कि दोनों ऑब्जेक्ट एक ही प्रकार के हैं; यदि नहीं, तो यह केवल झूठी वापसी करता है। 'इंटीजर' और 'बाइट' ऑब्जेक्ट्स हैं, इसलिए वही उनके लिए लागू होता है। यदि '(नया बाइट (0)) बराबर है (नया इंटीजर (0)) 'सच होगा, यह मेरे लिए थोड़ा अजीब होगा। एक तुलनीय उदाहरण होगा यदि '(नया कुत्ता (" ल्यूक ")) बराबर है (नई बिल्ली (" ल्यूक ")) 'सच हो जाएगी, सिर्फ इसलिए कि उनके पास एक ही नाम है (मुझे पता है, यहां सबसे अच्छा उदाहरण नहीं है, लेकिन तो आप देखते हैं कि यह कितना अजीब लगता है कि यह सच होगा)। –

+0

@ केविन क्रुइजसेन यह एक चीज है जिसे मुक्केबाजी होने पर आप उम्मीद नहीं करते हैं। कोई तर्क दे सकता है कि 'संख्या' को एक समानता की आवश्यकता हो सकती है जो' इंटेगर 'और' बाइट' को तुलनीय होने की अनुमति देती है, लेकिन इससे संभवतः 'फ़्लोट' और 'डबल' या खाते में ध्यान देने के लिए बहुत ही जटिल कार्यान्वयन के साथ अप्रत्याशित व्यवहार हो सकता है। 'अन्य' संख्या प्रकार। –

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