आप Collection
विशेष रूप Set
से JUnit 4 में तत्वों की समानता पर जोर कैसे देंगे ?
आप Collection
विशेष रूप Set
से JUnit 4 में तत्वों की समानता पर जोर कैसे देंगे ?
जवाबों:
आप दावा कर सकते हैं कि दो 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
एस एक ही आकार के हैं और समान तत्व हैं।
equals
और hashCode
वर्ग है कि आप अपने Hashtable में भंडारण कर रहे हैं में लागू?
अपाचे फिर से बचाव के लिए शुरू होता है।
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
एक जादू की तरह काम करता है। मुझे पता नहीं क्यों, लेकिन मैंने पाया कि संग्रह के साथ निम्नलिखित assertEquals(coll1, coll2)
हमेशा काम नहीं करता है। इस मामले में जहां यह मेरे लिए विफल रहा, मेरे पास सेट्स द्वारा समर्थित दो संग्रह थे। न तो हैमरेस्ट और न ही जूनियर कहेंगे कि संग्रह बराबर थे, हालांकि मुझे यकीन है कि वे जानते थे कि वे थे। CollectionUtils का उपयोग करना यह पूरी तरह से काम करता है।
हैमरेस्ट के साथ :
assertThat(s1, is(s2));
सादे मुखर के साथ:
assertEquals(s1, s2);
एनबी: टी ठोस सेट वर्ग के बराबर () विधि का उपयोग किया जाता है
एक विशेष रूप से दिलचस्प मामला है जब आप तुलना करते हैं
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()));
या मैं तत्व से उनकी तुलना कर सकता था।
एक अतिरिक्त विधि के रूप में जो कि सरणी आधारित है ... आप जूनटैक्स में अव्यवस्थित सरणी अभिकथन का उपयोग करने पर विचार कर सकते हैं। यद्यपि 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"/>
इस लेख की जाँच करें । वहाँ से एक उदाहरण:
@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);
}
Hamcrest का उपयोग करना:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
यह तब भी काम करता है जब सेट में अलग-अलग डेटाटाइप होते हैं, और केवल असफल होने के बजाय अंतर पर रिपोर्ट करते हैं।
यदि आप यह जांचना चाहते हैं कि सूची या सेट में विशिष्ट मानों का एक सेट है (पहले से मौजूद संग्रह के साथ तुलना करने के बजाय), तो अक्सर संग्रह की विधि आसान है:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
यह पहले अपेक्षित संग्रह का निर्माण करने और वास्तविक संग्रह के साथ तुलना करने और लिखने और सही करने में आसान से थोड़ा कम है।
(जाहिर है, यह एक विशेष रूप से साफ तरीका नहीं है, और दो तत्वों "फू" और "बार" से एक तत्व "फू, बार" को अलग नहीं कर सकता है। लेकिन व्यवहार में मुझे लगता है कि यह सबसे महत्वपूर्ण है कि यह लिखना आसान और तेज़ है। , अन्यथा कई डेवलपर्स बिना दबाए नहीं रहेंगे।)
मुझे हंस-पीटर स्टॉर का समाधान पसंद है ... लेकिन मुझे लगता है कि यह बिल्कुल सही नहीं है। दुख की बात 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;