JUnit मुखरता में सरणियों की तुलना में, अंतर्निहित तरीके से संक्षिप्त करें?


159

वहाँ एक संक्षिप्त, अंतर्निहित तरीके से JUnit में दो समान-टाइप सरणियों पर अभिकथन करने का तरीका है? डिफ़ॉल्ट रूप से (कम से कम JUnit 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]);

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

जवाबों:


298

Org.junit.Assert विधि का उपयोग करें assertArrayEquals:

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

यदि यह विधि उपलब्ध नहीं है, तो आपने गलती से एस्टर वर्ग से आयात किया हो सकता है junit.framework


लेकिन यह सब तब मिलता है जब यह अलग-अलग लंबाई के लिए विफल हो जाता है java.lang.AssertionError: array lengths differed, expected.length=6 actual.length=7। सबसे JUnit विफलता संदेशों के रूप में यह इतना उपयोगी नहीं है ... मैं कुछ
अभिकर्मक

1
@ user1075613 - मुझे यह मददगार लगता है। हमने कहा कि सरणियाँ बराबर थीं, वे नहीं हैं, और हमें एक संकेत दिया गया है कि क्यों। वहां से, हम एक ब्रेकपॉइंट सेट कर सकते हैं, और सरणियों की विस्तार से जांच कर सकते हैं।
एंडी थॉमस

1
ठीक है, यह थोड़ा - सहायक है। हालाँकि जब आप इसे इंगित करते हैं, तो आपके पास यह संदेश होता है कि आप स्वयं से पूछें "यह समान लंबाई क्यों नहीं है?" इसलिए आप सामग्री की जांच करना चाहते हैं। जब एक अच्छा त्रुटि संदेश सीधे इसे बता सकता है तो डिबगर के साथ समय क्यों खोना है? (सुनिश्चित करें कि आपको अभी भी कभी-कभी डिबगर की आवश्यकता है, लेकिन अधिकांश समय आप नहीं करते हैं)
user1075613

आप JUnit के इश्यू ट्रैकिंग सिस्टम में समस्याएँ प्रस्तुत कर सकते हैं । ध्यान रखें, हालांकि, 1) तेजी से विफल होने पर, ओ (1) में, एक फायदा हो सकता है, 2) जोर विफलता उत्पादन ओ (एन) नहीं होना चाहिए। JUnit समस्या ट्रैकिंग सिस्टम आगे की चर्चा के लिए एक बेहतर मंच है।
एंडी थॉमस

1
@anddero - Assert.assertFalse( Arrays.equals( expectedResult, result ))
एंडी थॉमस

35

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

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

14
इसके बारे में क्या बदबू आ रही है, हालांकि आपको असफल होने पर क्या हुआ, इस बारे में कोई डेटा नहीं मिला है।
18

8
जब आप एक पुराने जूनियर संस्करण (जैसे एंड्रॉइड पर) पर अच्छा लगा
Zitrax

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

17

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

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

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

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


11

1
हम्म, मैं अपने 'जूनिट.फ्रेमवर्क.सर्वर' में कोई 'दावा नहीं' देख सकता हूँ?
18

4.8.1 मेरे पास क्या है, और मावेन ( grepcode.com/… ) के माध्यम से नवीनतम उपलब्ध प्रतीत होता है । क्या यह केवल 4.8.2 या 4.9 में है?
मारिया

4

Junit4 और 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>]

2

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.