जेयूनिट में संग्रहकर्ता?


जवाबों:


125

4.4 का उपयोग करते हुए आप हैमरेस्ट कोड के assertThat()साथ एक साथ उपयोग कर सकते हैं (चिंता न करें, यह संग्रह के साथ काम करने वाले लोगों सहित जटिल आत्म-वर्णन करने वाले मुखर.jar का उत्पादन करने के लिए, JUnit के साथ शिप नहीं किया गया है )

import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.*;
import static org.hamcrest.CoreMatchers.*;

List<String> l = Arrays.asList("foo", "bar");
assertThat(l, hasItems("foo", "bar"));
assertThat(l, not(hasItem((String) null)));
assertThat(l, not(hasItems("bar", "quux")));
// check if two objects are equal with assertThat()

// the following three lines of code check the same thing.
// the first one is the "traditional" approach,
// the second one is the succinct version and the third one the verbose one 
assertEquals(l, Arrays.asList("foo", "bar")));
assertThat(l, is(Arrays.asList("foo", "bar")));
assertThat(l, is(equalTo(Arrays.asList("foo", "bar"))));

इस दृष्टिकोण का उपयोग करके आप स्वचालित रूप से मुखर का एक अच्छा विवरण प्राप्त करेंगे जब यह विफल हो जाता है।


1
ओह, मुझे महसूस नहीं हुआ था कि हैमरेस्ट ने इसे जूनियर डिस्ट्रो में बनाया था। जाओ नेट!
Skaffman

अगर मैं दावा करना चाहता हूं कि एल वस्तुओं ("फू", "बार") से बना है, लेकिन कोई अन्य आइटम मौजूद नहीं है - क्या इसके लिए कुछ आसान वाक्यविन्यास है?
ripper234

उपरोक्त कोड स्निपेट का उपयोग करें और एक अतिरिक्त जोर में फेंकें (l.size () == 2)
aberrant80

4
मेह, बदसूरत। NUnit में, CollectionAssert.AreEqual (संग्रह अपेक्षित, संग्रह वास्तविक);
ripper234

1
Google को एक और Stackoverflow का उत्तर मिला है जिसकी मुझे तलाश थी!
Mykola Golubyev 10

4

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


यह किसी कारण से संकलन नहीं करता है (देखें stackoverflow.com/questions/1092981/hamcrests-hasitems ): ArrayList <Integer> वास्तविक = नया ArrayList <Integer> (); ArrayList <Integer> अपेक्षित = नया ArrayList <Integer> (); actual.add (1); expected.add (2); मुखर (वास्तविक, hasItems (अपेक्षित));
ripper234

2

FEST धाराप्रवाह अभिकथनों पर एक नज़र डालें। IMHO वे हैमरेस्ट (और समान रूप से शक्तिशाली, एक्स्टेंसिबल आदि) की तुलना में उपयोग करने के लिए अधिक सुविधाजनक हैं और फ्लुपी इंटरफ़ेस के लिए बेहतर आईडीई समर्थन है। Https://github.com/alexruiz/fest-assert-2.x/wiki/Using-fest-assertions देखें


2017 में ऐसा लगता है कि अधिक लोग एस्टरज नामक FEST की एक शाखा का उपयोग कर रहे हैं।
अधिकतम

2

Joachim Sauer का समाधान अच्छा है, लेकिन यह काम नहीं करता है यदि आपके पास पहले से ही अपेक्षाओं की एक सरणी है जिसे आप सत्यापित करना चाहते हैं कि आप अपने परिणाम में हैं। यह तब हो सकता है जब आप पहले से ही अपने परीक्षणों में उत्पन्न या निरंतर अपेक्षा रखते हैं, जिसके परिणामस्वरूप आप तुलना करना चाहते हैं, या शायद आपके पास कई अपेक्षाएं हैं जो आप परिणाम में विलय होने की उम्मीद करते हैं। इसलिए माचिस का उपयोग करने के बजाय आप केवल List::containsAllऔर assertTrueउदाहरण के लिए उपयोग कर सकते हैं :

@Test
public void testMerge() {
    final List<String> expected1 = ImmutableList.of("a", "b", "c");
    final List<String> expected2 = ImmutableList.of("x", "y", "z");
    final List<String> result = someMethodToTest(); 

    assertThat(result, hasItems(expected1)); // COMPILE ERROR; DOES NOT WORK
    assertThat(result, hasItems(expected2)); // COMPILE ERROR; DOES NOT WORK

    assertTrue(result.containsAll(expected1));  // works~ but has less fancy
    assertTrue(result.containsAll(expected2));  // works~ but has less fancy
}

आप हमेशा उपयोग कर सकते हैं hasItems(expected1.toArray(new String[expected1.size()]))। यह आपको बेहतर विफलता संदेश देगा।
मेसट्रस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.