JUnit 4 सेट की तुलना करते हैं


102

आप Collectionविशेष रूप Setसे JUnit 4 में तत्वों की समानता पर जोर कैसे देंगे ?



क्या आप यह सुनिश्चित करने की कोशिश कर रहे हैं कि दो सेट एक-दूसरे के बराबर हैं (समान तत्व होते हैं), या एक ही सेट के दो तत्व समान हैं?
छिपकली

मुझे यह देखने की जरूरत है कि दो सेट के तत्व बराबर हैं
इकबाल

जवाबों:


103

आप दावा कर सकते हैं कि दो Setएस एक दूसरे के बराबर हैं, जो Set equals()विधि को आमंत्रित करता है

public class SimpleTest {

    private Set<String> setA;
    private Set<String> setB;

    @Before
    public void setUp() {
        setA = new HashSet<String>();
        setA.add("Testing...");
        setB = new HashSet<String>();
        setB.add("Testing...");
    }

    @Test
    public void testEqualSets() {
        assertEquals( setA, setB );
    }
}

यह @Testपास हो जाएगा यदि दो Setएस एक ही आकार के हैं और समान तत्व हैं।


7
रिपोर्ट में यह बहुत अच्छे परिणाम प्रदर्शित नहीं करता है। यदि आपके स्टोर्स्ट्स को स्पष्ट रूप से परिभाषित किया गया है तो यह बेहतर है, लेकिन फिर भी अच्छा नहीं है (एक छोटा अंतर पाठ के एक पेज के साथ समाप्त हो सकता है)
बिल के

Uhm, कैसे मैं मिलता है: java.lang.AssertionError: उम्मीद: java.util.Hashtable <{CompanyName = 8PKQ9va3nW8pRWb4SjPF2DvdQDBmlZ, रिक = sZwmXAdYKv, श्रेणी = AvrIfd, QuoteId = 4342740204922826921}> लेकिन था: java.util.Hashtable <{CompanyName = 8PKQ9va3nW8pRWb4SjPF2DvdQDBmlZ, Ric = sZwmXAdYKv, श्रेणी = AvrIfd, QuoteId = 434272204922826921}>
Giovanni Botta

3
@Giodude क्या आप है equalsऔर hashCodeवर्ग है कि आप अपने Hashtable में भंडारण कर रहे हैं में लागू?
छिपकली

जैसा कि आप देख सकते हैं कि वे सिर्फ तार और एक लंबे समय हैं ... मैं एवरो को मानचित्रण और डी-सीरियलाइज़ करने के लिए एवरो का परीक्षण कर रहा हूं और इसका परिणाम है। मुझे लगता है कि कुछ गड़बड़ हो रहा है जिस तरह से तार सिलसिलेवार और डी-सीरीज़ किए गए हैं जो परीक्षण को विफल कर देते हैं लेकिन मैं समस्या का पता नहीं लगा सकता।
जियोवन्नी बोता

मेरे लिए काम नहीं किया, भले ही मैं दो HashSet <Long> की तुलना कर रहा हूं। @MattFriedman जवाब वास्तव में मेरे उपयोग के मामले के लिए काम करता है।
bluecollarcoder

46

अपाचे फिर से बचाव के लिए शुरू होता है।

assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));

एक जादू की तरह काम करता है। मुझे पता नहीं क्यों, लेकिन मैंने पाया कि संग्रह के साथ निम्नलिखित assertEquals(coll1, coll2)हमेशा काम नहीं करता है। इस मामले में जहां यह मेरे लिए विफल रहा, मेरे पास सेट्स द्वारा समर्थित दो संग्रह थे। न तो हैमरेस्ट और न ही जूनियर कहेंगे कि संग्रह बराबर थे, हालांकि मुझे यकीन है कि वे जानते थे कि वे थे। CollectionUtils का उपयोग करना यह पूरी तरह से काम करता है।


20
यह वास्तव में तुच्छ है, मुश्किल हिस्सा कॉल करने वाले को स्पष्ट रूप से इंगित करने के लिए है
बिल के

1
स्वीकृत उत्तर मूल प्रश्न (दो सेटों के लिए विशेष रूप से इकाई परीक्षण) के लिए एक अच्छा उत्तर है, लेकिन कलेक्शन यूटिल्स के साथ यह उत्तर मुझे लगता है कि सबसे सामान्य मामले के लिए बेहतर उत्तर है। मैं एक संग्रह और एक सेट की तुलना करने में सक्षम नहीं था जब तक कि CollectionUtils का उपयोग न किया जाए।
जय

16

हैमरेस्ट के साथ :

assertThat(s1, is(s2));

सादे मुखर के साथ:

assertEquals(s1, s2);

एनबी: टी ठोस सेट वर्ग के बराबर () विधि का उपयोग किया जाता है


1
हम इस पद्धति को पसंद करते हैं क्योंकि हैमरेस्ट जुनेट 4 के साथ आता है इसलिए यह अन्य पुस्तकालयों की कोई आवश्यकता नहीं है।
JRSofty

2
जब सेट अलग-अलग प्रकार का हो तो यह काम नहीं कर सकता है।
हंस-पीटर स्टॉर

7

एक विशेष रूप से दिलचस्प मामला है जब आप तुलना करते हैं

   java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]> 

तथा

   java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>

अब तक, मेरा एकमात्र समाधान दोनों को सेट में बदलना है

assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));

या मैं तत्व से उनकी तुलना कर सकता था।


वास्तव में, इसके कई समाधान हैं जो अन्य उत्तरों में प्रस्तुत किए गए हैं। सेट इसके लिए थोड़े दुर्भाग्यपूर्ण हैं, वैसे भी, क्योंकि वे आदेश की अनदेखी करते हैं। शायद ArrayList?
हंस-पीटर स्टॉर

4

एक अतिरिक्त विधि के रूप में जो कि सरणी आधारित है ... आप जूनटैक्स में अव्यवस्थित सरणी अभिकथन का उपयोग करने पर विचार कर सकते हैं। यद्यपि Apache CollectionUtils उदाहरण काम करेगा, वहाँ ठोस अभिकर्मक एक्सटेंशन का एक प्रकार है:

मैं सोचता हूं कि

ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});

दृष्टिकोण आपके लिए और अधिक पठनीय और डीबग करने योग्य होगा (सभी संग्रह समर्थन ऐरे () का समर्थन करते हैं, इसलिए ArrayAssert विधियों का उपयोग करना काफी आसान होना चाहिए)

बेशक नकारात्मक पक्ष यह है कि, junitx एक अतिरिक्त जार फ़ाइल या मावेन प्रविष्टि है ...

 <dependency org="junit-addons" name="junit-addons" rev="1.4"/>

2

इस लेख की जाँच करें । वहाँ से एक उदाहरण:

@Test  
public void listEquality() {  
    List<Integer> expected = new ArrayList<Integer>();  
    expected.add(5);  

    List<Integer> actual = new ArrayList<Integer>();  
    actual.add(5);  

    assertEquals(expected, actual);  
}  

संक्षिप्त लेकिन महान लिंक, वास्तव में बहुत तेज़ी से समझाता है कि आप Junit4 के साथ क्या कर सकते हैं-
जोहान्स

1
लिंक टूट गया है। कोई भी मौका आप एक संग्रहीत संस्करण ऑनलाइन पा सकते हैं या इसकी सामग्री को संक्षेप में बता सकते हैं?
१ .

1

Hamcrest का उपयोग करना:

assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));

यह तब भी काम करता है जब सेट में अलग-अलग डेटाटाइप होते हैं, और केवल असफल होने के बजाय अंतर पर रिपोर्ट करते हैं।


2
IsIn के लिए आयात क्या है? IntelliJ किसी भी हैमरेट पैकेज के साथ आयात को हल नहीं कर सकता है।
फेबियन

0

यदि आप यह जांचना चाहते हैं कि सूची या सेट में विशिष्ट मानों का एक सेट है (पहले से मौजूद संग्रह के साथ तुलना करने के बजाय), तो अक्सर संग्रह की विधि आसान है:

String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());

List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());

यह पहले अपेक्षित संग्रह का निर्माण करने और वास्तविक संग्रह के साथ तुलना करने और लिखने और सही करने में आसान से थोड़ा कम है।

(जाहिर है, यह एक विशेष रूप से साफ तरीका नहीं है, और दो तत्वों "फू" और "बार" से एक तत्व "फू, बार" को अलग नहीं कर सकता है। लेकिन व्यवहार में मुझे लगता है कि यह सबसे महत्वपूर्ण है कि यह लिखना आसान और तेज़ है। , अन्यथा कई डेवलपर्स बिना दबाए नहीं रहेंगे।)


यह आपके इकाई परीक्षण के परिणाम को सूची से हटाए जाने के कार्यान्वयन पर निर्भर करता है। यदि वे इकाई परीक्षण के प्रारूपण को बदलने का निर्णय नहीं लेते हैं, तो काम नहीं करेंगे। मैं इसे सुरक्षित नहीं मानूंगा।
लॉरेंस ओप टी। ज़ंड्ट

@ LaurensOp'tZandt आपका मतलब है कि Oracle संग्रह Collection.toList () का प्रारूप बदल रहा है? यह निश्चित रूप से नहीं होने जा रहा है। हालाँकि, आप सही हैं कि विशेष रूप से साफ नहीं है। लेकिन व्यवहार में, मेरी धारणा है कि यह सबसे महत्वपूर्ण है कि परीक्षण लिखना बहुत आसान है।
हंस-पीटर स्टॉर

मैं मानता हूं, मुझे लगता है कि स्ट्रोस्टिंग विधि की संभावना नहीं होगी। तो शायद यह काम करता रहेगा। मैं सिर्फ यह बताना चाहता हूं कि इसका बहुत साफ तरीका नहीं है। लेकिन वास्तव में यह बहुत आसान है। एक समस्या है जो सेट की तुलना करते समय होती है। चूंकि उनके आदेश की गारंटी नहीं है।
लॉरेंस ओप 'टी ज़ंड्ट

0

मुझे हंस-पीटर स्टॉर का समाधान पसंद है ... लेकिन मुझे लगता है कि यह बिल्कुल सही नहीं है। दुख की बात containsInAnyOrderयह है कि Collectionतुलना करने के लिए objetcs के एक स्वीकार नहीं करता है। तो यह एक हो गया है Collectionकी Matcherरों:

assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))

आयात कर रहे हैं:

import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.