2010-11-19 10 views
84

क्या जुनीट में दो तरह के टाइप किए गए सरणी पर समानता करने के लिए एक संक्षिप्त, अंतर्निहित तरीका है? डिफ़ॉल्ट रूप से (कम से कम जुनीट 4 में) ऐसा लगता है कि एक उदाहरण एरे ऑब्जेक्ट पर ही तुलना करता है।जुनीट दावे में सरणी की तुलना, संक्षिप्त अंतर्निहित तरीके से?

ईजी, काम नहीं करता:

int[] expectedResult = new int[] { 116800, 116800 }; 
int[] result = new GraphixMask().sortedAreas(rectangles); 
assertEquals(expectedResult, result); 
बेशक

, मैं इसे मैन्युअल रूप से कर सकते हैं के साथ:

assertEquals(expectedResult.length, result.length); 
for (int i = 0; i < expectedResult.length; i++) 
    assertEquals("mismatch at " + i, expectedResult[i], result[i]); 

..लेकिन वहाँ एक बेहतर तरीका है?

assertTrue(Arrays.equals(expectedResult, result)); 

उत्तर

175

उपयोग org.junit.Assert की विधि assertArrayEquals:

import org.junit.Assert; 
... 

Assert.assertArrayEquals(expectedResult, result); 

इस विधि उपलब्ध नहीं है, तो आप गलती से आयात किया गया जोर वर्ग

30

आप Arrays.equals(..) उपयोग कर सकते हैं junit.framework से।

+10

क्या बदबू आ रही है कि हालांकि के बारे में आप क्या गलत हो गया था जब यह विफल के बारे में कोई डेटा प्राप्त है। – mBria

+7

अच्छा जब आप पुराने जूनिट संस्करण (एंड्रॉइड की तरह) पर हैं – Zitrax

+0

यदि आप देखना चाहते हैं कि कौन से बाइट मेल नहीं खाते हैं तो आप उन्हें स्ट्रिंग में परिवर्तित कर सकते हैं: assertEquals (Arrays.toString (अपेक्षितResult), Arrays.toString (परिणाम)) ; – Erdem

10
+1

एचएम, मुझे अपने 'junit.framework.Assert' में कोई भी 'assertArrayEquals' नहीं दिख रहा है? – mBria

+1

@ एमबीरिया अपने जूनिट – Bozho

+0

4.8.1 को अपग्रेड करें जो मेरे पास है, और मैवेन (http://grepcode.com/search?query=junit+4.9&start=0&entity=type&n=) के माध्यम से नवीनतम उपलब्ध प्रतीत होता है। क्या यह केवल 4.8.2 या 4.9 में है? – mBria

2

मैं जानता हूँ कि प्रश्न JUnit4 के लिए है, लेकिन अगर आप JUnit3 में अटक के लिए हो, तो आप उस तरह एक छोटी उपयोगिता समारोह बना सकते हैं:

private void assertArrayEquals(Object[] esperado, Object[] real) { 
    assertEquals(Arrays.asList(esperado), Arrays.asList(real));  
} 

JUnit3 में, यह सीधे सरणियों की तुलना से बेहतर है , क्योंकि यह विस्तार से बताएगा कि कौन से तत्व अलग हैं।

8

मैं तार को सरणियों कन्वर्ट करने के लिए पसंद करते हैं:

Assert.assertEquals(
       Arrays.toString(values), 
       Arrays.toString(new int[] { 7, 8, 9, 3 })); 

इस तरह से मैं स्पष्ट रूप से देख सकते हैं, जहां गलत मान हैं। यह केवल छोटे आकार के सरणी के लिए प्रभावी ढंग से काम करता है, लेकिन मैं शायद ही कभी अपने यूनिट परीक्षणों में 7 से अधिक वस्तुओं के साथ सरणी का उपयोग करता हूं।

यह विधि आदिम प्रकारों और अन्य प्रकारों के लिए काम करती है जब toString का अधिभार सभी आवश्यक जानकारी देता है।

0

जूनिट 4 और Hamcrest का उपयोग करके आपको सरणी की तुलना करने का एक संक्षिप्त तरीका मिलता है। यह विफलता ट्रेस में त्रुटि कहां है, इसका विवरण भी देता है।

import static org.junit.Assert.* 
import static org.hamcrest.CoreMatchers.*; 

//... 

assertThat(result, is(new int[] {56, 100, 2000})); 

विफलता ट्रेस उत्पादन:

java.lang.AssertionError: 
    Expected: is [<56>, <100>, <2000>] 
    but: was [<55>, <100>, <2000>] 
संबंधित मुद्दे